http://www.lydsy.com/JudgeOnline/problem.php?id=2081
https://www.luogu.org/problem/show?pid=3498
一题字符串hash
一开始因为各种原因导致我TLE和WA等等。。。。。
发现基数base会有各种问题,注意一下就好了
我的方法是hash+map映射,所以long long自然溢出不影响结果
所以我没取模。。。
番外:我取的基数base一开始取了n+1WA掉了,后来改成2333和6666都过了。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200001],ans[200001];
ll ba,h1[200001],h2[200002],po[200001];
map<ll,bool>b;
int main()
{
int n;scanf("%d",&n);ba=2333;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
po[0]=1;for(int i=1;i<=n;i++)po[i]=po[i-1]*ba;
for(int i=1;i<=n;i++)h1[i]=h1[i-1]*ba+(ll)a[i];
for(int i=n;i>0;i--)h2[i]=h2[i+1]*ba+(ll)a[i];
int ma,sum;ma=sum=0;
for(int i=1;ma*i<=n&&i<=n;i++){
b.clear();
int p=0;
for(int j=1;j+i-1<=n;j+=i){
ll ha1,ha2,x=j-1,y=j+i-1;
ha1=h1[y]-h1[x]*po[y-x];
x++;y++;
ha2=h2[x]-h2[y]*po[y-x];
if(!b[ha1]||!b[ha2]){
p++;
b[ha1]=b[ha2]=1;
}
}
if(p>ma){ma=p;sum=1;ans[1]=i;}
else if(p==ma)ans[++sum]=i;
}
printf("%d %d\n%d",ma,sum,ans[1]);
for(int i=2;i<=sum;i++)printf(" %d",ans[i]);
}