hash裸题,有一些优化的方式,比如吧正序和逆序乘起来作为比较的值,我用的map,(而且我自带大常数)
所以在落谷过了之后,bzoj怎么都不过。。
不要站代码,思路一样自己写就好了
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#define seed 13131
using namespace std;
typedef unsigned long long ull;
int n,val[200005],ans,flag,as[200005],ct;
ull has[200005],cf[200005],has1[200005];
map<ull,bool>M;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&val[i]);
cf[0]=1;
for(int i=1;i<=n;i++)
{
has[i]=has[i-1]*seed+val[i];
cf[i]=cf[i-1]*seed;
has1[i]=has1[i-1]*seed+val[n-i+1];
}
for(int i=1;i<=n;i++)
{
flag=0;int ttw=0;
for(int j=1;j+i-1<=n;j+=i)
{
ull tr1=has[j+i-1]-cf[i]*has[j-1],tr2=has1[n-j+1]-cf[i]*has1[n-j-i+1];
if(!M[tr1*tr2])
{
M[tr1*tr2]=1,ttw++;
}
}
if(ans<ttw)
{
ct=0;
ans=ttw,as[++ct]=i;
}else if(ans==ttw)
{
as[++ct]=i;
}
}
printf("%d %d\n",ans,ct);
for(int i=1;i<=ct;i++)
{
printf("%d ",as[i]);
}
return 0;
}