小G的项链(Manacher)

我看网上也没有写这个题的,顺便写一下(可能是大佬都觉得太简单了
链接:牛客网

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:
%lld

题目描述

有一串有n颗珠子的项链,每颗珠子上有一个数字,从顺时针方向看依次是第1,2,…,n个珠子,第n个珠子之后是第1个珠子。但是小G觉得这串项链的造型不够美观,他决定用这串项链上的珠子造出一个新的项链,并且他希望这串新的项链是对称的。
一串项链是对称的,当且仅当存在至少一颗珠子满足:把它作为起始位置(即顺时针和逆时针方向数第0个珠子),对于任意的自然数i,顺时针数第i个珠子上的数字和逆时针数第i个珠子上的数字相同。特别的,一个仅有一颗珠子的项链也是对称的。
小G可以使用合成技术将任意正整数颗珠子合成为一个新的珠子,新珠子上的数字=原珠子上的数字的异或和。
用合成技术造出新项链的过程是这样的:最开始由小G确定一个能整除n的正整数k和一个原项链中的起始位置,之后从起始位置开始顺时针方向取连续的k个珠子,合成一个新的珠子作为新项链的第1个珠子,再取接下来连续的k个珠子,合成一个新的珠子作为新项链的第2个珠子,……,直到取完原项链的所有珠子为止。注意,合成的新珠子会直接放到新项链的位置,并不会插入原项链之中参与之后合成过程。新项链同样满足从顺时针方向看依次是第1,2,…,n个珠子,第n个珠子之后是第1个珠子。
小G希望新的项链上的珠子尽可能多,问新项链上的珠子最多有多少个。

输入描述:

第一行一个整数n。
第二行n个整数,第i个整数ai代表原项链上第i个珠子上的数字。

输出描述:
共一行一个整数,代表新项链的最大珠子数量。
示例1
输入

5
9 3 9 1 1

输出

5

示例2
输入

9
7 8 6 5 4 3 1 2 15

输出

3

备注:
1 ≤ n ≤ 2 x 105,0 ≤ ai ≤ 109
题意:
给你n个数组成环,分成k个等长的区间,每个区间的值就是区间内部数的异或和,用区间的相对位置摆成环,且使这个环组成回文串,问你回文串最长是多少?
题解:
因为n个数组成环,所以我们先把环破开,就是环翻倍(n+n),让尾连头。然后求出所有前缀异或和pre
因为要把n分成长度为len的num个区间。
我们要尝试len的每一种情况,让每个区间内的len个数异或和,然后看组成的是不是回文串,找到最大的len情况。
因为我们一开始将2*n个数都存了前缀异或和,根据异或的性质,a^a=0,所以我就可以通过前缀异或和轻松算出每个区间的异或值(比如pre[3] ^ pre[6]算出来就是区间[4,6]的异或和,因为3之前的重复就消除了)
求出每区间的异或和放在一个数组b中,再求b是否为回文串。但注意b是一个环直接判断可能不对(比如abb不是回文串,但是abb是一个环如果你用正确的打开方式,它也可以是bab,那就是回文串了),那该怎么办?对,既然是环我们就给它拆成链,我们把项链倍长,如果倍长后的字符串中存在一个子串是回文串且长度超过了倍长前字符串的长度,显然是存在对称轴的。
(还是abb,拆之后就是abbabb,看这个最长回文串的长度(5)是否大于本身(3))
至此基本上就大功告成了
什么?你说用什么求回文串,(那肯定暴力 )当然用Manacher
b站讲解Manacher
附码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;int n;
int p[maxn*2];
int str[maxn*2];//数组范围要乘2,因为环要拆成链
int a[maxn*2];
int b[maxn*2];
int pre[maxn*2];int init(int *s,int len)
{str[0]='@';int ant=1;str[1]='#';for(int i=1;i<=len;i++){str[++ant]=s[i];str[++ant]='#';}str[++ant]='\0';return ant;
}
int manacher(int *s,int num)
{int ans=-1;int len=init(b,num);int mx=0;int id=0;for(int i=1;i<len;i++){if(i<mx)p[i]=min(p[id*2-i],mx-i);else p[i]=1;while(str[i+p[i]]==str[i-p[i]])p[i]++;if(p[i]+i>mx)mx=p[i]+i,id=i;ans=max(ans,p[i]-1);}return ans;
}
bool check(int len) {int num = n / len;for(int i = 0; i < len; i++) {for(int j = 0; j < num; j++) {b[j] = pre[(j + 1) * len + i] ^ pre[j * len + i];}for(int i = 0; i < num; ++i) {b[i + num] = b[i];}if(manacher(b, num * 2)>num)  return true;}return false;
}
int main() {cin>>n;for(int i = 1; i <= n; i++) {cin>>a[i];pre[i] = pre[i-1] ^ a[i];}for(int i = n + 1; i <= n + n; i++) {pre[i] = pre[i - 1] ^ a[i - n];}int ans = 1;for(int i = 1; i <= sqrt(n); i++) {if(n % i) continue;if(check(n / i)) ans = max(ans, i);if(check(i)) ans = max(ans, n / i);}printf("%d\n", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Win10极简SonarQube C#代码质量分析

博客有些好些时间未更新了&#xff0c;这几个月的时间里&#xff0c;离开了实习的公司、大学毕了业、来了新公司、转了户口&#xff0c;有点忙&#xff0c;最近总算稍微闲下来了&#xff0c;打算重新拾起博客&#xff0c;坚持写下去。言归正转&#xff0c;什么是SonarQube ?So…

2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲

2018年牛客多校算法寒假训练营练习比赛&#xff08;第一场&#xff09;C. 六子冲 题目链接 做法&#xff1a;模拟即可 #include <bits/stdc.h> #define P pair<int,int> #define fir first #define sec second #define rep(i,a,b) for(int ia;i<b;i) using name…

YbtOJ#20078-[NOIP2020模拟赛B组Day7]路径之和【分治,Flody】

正题 题目链接:http://noip.ybtoj.com.cn/contest/108/problem/4 题目大意 nnn个点&#xff0c;每次只封闭一个点&#xff0c;求剩下点对两两之间的最短路和。 解题思路 FlodyFlodyFlody中如果枚举kkk时不管某一个点&#xff0c;那么就可以求不经过那个点的路径。考虑分治求解…

大吉大利【牛客网】(牛客练习赛60)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 第一行一个整数n. 第二行n个整数ai. 输出描述: 一个整数表示上述求和式的答案. 示例1 输入 5 1 2 3 4 5输出…

【差分】Tallest Cow(poj 3263/luogu 2879)

Tallest Cow poj 3263 luogu 2879 题目大意&#xff1a; 现在有n头牛&#xff0c;两头牛如果要相互看到&#xff0c;那他们之间的牛必须比他们两低&#xff0c;现在给出n&#xff0c;最高牛的位置和高度&#xff0c;和m对关系&#xff0c;要你求每头牛最高是多少 输入样例…

【项目管理】git和码云的使用

缘起说了那么多关于git和码云相关的事&#xff0c;一直都没给大伙讲解这个码云究竟是个啥玩意儿。今天就给大伙说说如何通过git和码云搭建属于自己的代码库。码云码云(GitOSC)是开源中国社区团队推出的基于Git的快速的、免费的、稳定的在线代码托管平台,不限制私有库和公有库数…

牛客网暑期ACM多校训练营(第十场)F.Rikka with Line Graph

牛客网暑期ACM多校训练营&#xff08;第十场&#xff09;F.Rikka with Line Graph 做法&#xff1a;\(G\) 中的对应原图两条边(a,b) (c,d)的最短路为:\[ w[a][b] w[c][d] 2* min(dis[a][c], dis[a][d], dis[b][c], dis[b][d])\] 其中\(dis[i][j]\)表示原图G中i 到 j 的最短路…

AT2165-[AGC006D]MedianPyramidHard【二分,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/AT2165 题目大意 nnn行的一个金字塔&#xff0c;第iii层有2i−12\times i-12i−1个格子&#xff0c;每个格子是它左右下的中位数。给出最下面的2n−12n-12n−1个数&#xff0c;求第一行的数。 解题思路 我们先二分一个答案&a…

三角形周长和【牛客网】牛客网练习赛60

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 输入描述 第一行一个整数表示n. 接下来n行每行两个整数x,y表示一个点. 输出描述: 输出一个整数表示周长…

【二分】递增(luogu 3902)

递增 luogu 3902 题目大意&#xff1a; 给出一个序列&#xff0c;问最少修改多少个数字可以使他单调递增 输入样例 3 1 3 2输出样例 1 数据范围 对于50% 的数据&#xff0c;N≤103N \le 10^3N≤103 对于100% 的数据&#xff0c;1≤N≤105,1≤Ai≤1091 \le N \le 10^5 , …

AspNetCore 基于AOP实现Polly的使用

前言 说起AOP&#xff0c;其实我们在做MVC/API 的时候应该没少接触&#xff0c;比如说各种的Fitter 就是典型的AOP了。本来在使用Polly的时候我最初的打算是使用过滤器来实现的&#xff0c;后来发现实现起来相当的困难&#xff0c;利用NetCore的中间以及过滤器去实现一个AOP的…

HDU5794 - A Simple Chess

HDU5794 - A Simple Chess 做法&#xff1a;首先的想法就是用总方案数减去&#xff0c;经过过障碍的方案数A。第一个思路就是容斥&#xff0c;但是显然不符合数据规模。另一个思路就是将障碍物从左上到右下排序&#xff0c;dp[i] 表示不经过前i-1个障碍&#xff0c;到达第i个障…

P1829-[国家集训队]Crash的数字表格/JZPTAB【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P1829 题目大意 给出n,mn,mn,m求∑i1n∑j1mlcm(i,j)\sum_{i1}^n\sum_{j1}^mlcm(i,j)i1∑n​j1∑m​lcm(i,j) 解题思路 ∑i1n∑j1mijgcd(i,j)\sum_{i1}^n\sum_{j1}^m\frac{ij}{gcd(i,j)}i1∑n​j1∑m​gcd(i,j)ij​ ∑x1nx(∑…

.NET Core开发日志——配置

熟悉ASP.NET的开发者一定对web.config文件不陌生。在ASP.NET环境中&#xff0c;要想添加配置参数&#xff0c;一般也都会在此文件中操作。其中最常用的莫过于AppSettings与ConnectionStrings两项。而要在代码中获得文件中的配置信息&#xff0c;ConfigurationManager则是必不可…

【模拟】杯子

杯子 题目大意&#xff1a; 有n个1&#xff0c;现在可以将两个相同的数加在一起&#xff0c;使数字个数-1&#xff0c;现在要将数字个数控制在k以下&#xff08;包括k&#xff09;&#xff0c;但可能要多加几个1&#xff0c;现在问你最少加多少个1 输入样例#1 3 1 输出样例…

操作集锦【牛客网】 牛客练习赛60

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 有一款自走棋有26种操作,每种操作我们都用a,b,c,d,…,x,y,z的符号来代替. 现在牛牛有一个长度为nnn的操作序列,他现…

[2020.11.3NOIP模拟赛]选数字【容斥】

正题 题目链接:https://www.luogu.com.cn/problem/U138404?contestId36493 题目大意 nnn个数字&#xff0c;每次询问一个区间有多少个三对数或为xxx。 解题思路 首先显然这些数都不能有xxx没有的位数&#xff0c;那么我们选择的数都得是被xxx包含的&#xff0c;这些数的数量…

Codeforces 1054D Changing Array

Codeforces 1054D Changing Array 做法&#xff1a;给定一个序列&#xff0c;每个数可以把在2进制k位下取反&#xff0c;也可以不变&#xff0c;在改变后&#xff0c;这个序列异或和不为0的区间的个数。考虑如何求出尽可能少的异或为0的序列&#xff0c;对序列求前缀之后&#…

解决C# 7.2中的结构体性能问题

在某些使用了readonly关键字的情况下&#xff0c;C#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下来了&#xff0c;但仍然值得重新审视&#xff0c;因为它与C# 7.2的几个特性有关。in和ref readonly关键字的使用让这个问题出现得更频繁&#xff0c;而re…

【DP】玩具

玩具 题目大意&#xff1a; 有n个物品&#xff0c;每个物品有自己的代价&#xff0c;相邻的物品不能同时购买&#xff0c;现在有m元&#xff0c;问最多买多少件物品 输入样例 3 8 4 4 5 输出样例 1 数据范围 对于30%的数据&#xff0c;n≤10&#xff1b; 对于60%的数据&…