1461:Beads
不过感觉hash的题和KMP的有类似的地方?
#include <bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;
int n,a[200005],ans[200005],total=1;
ll p[200005],suml[200005],sumr[200005],b=1000000007;
map<ll,int>mp;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int i,j,c=0,maxn=1;
cin>>n;
p[0]=1;
for(i=1;i<=n;i++)
{
cin>>a[i];
p[i]=p[i-1]*b,suml[i]=suml[i-1]*b+a[i];
}
for(i=n;i>=1;i--)
{
sumr[i]=sumr[i+1]*b+a[i];
}
for(i=1;i<=n;i++) /**< i用来表示字串长度,最大为n,不可以用n/2*/
{
mp.clear();
c=0;
for(j=i;j<=n;j+=i)
{
ll h1=suml[j]-suml[j-i]*p[i];
ll h2=sumr[j-i+1]-sumr[j+1]*p[i];
ll h3=h1*h2; /**< 正反认为同一个串,所以如果两串相同,
正向hash值h1和反向hash值h2的乘积的值必然一样 */
if(!mp[h3])
{
c++;
mp[h3]=1;
}
}
if(c>maxn)
{
maxn=c;
total=1;
ans[total++]=i;
}
else if(c==maxn)
{
ans[total++]=i;
}
}
cout<<maxn<<' '<<total-1<<endl;
for(i=1;i<total;i++)
cout<<ans[i]<<' ';
return 0;
}