思路就是跟题解一样的哈希乘以反向哈希建立集合
#include<bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
const int MAXN=1e7+10;
int num,ans;
ull a[MAXN],b[MAXN];
ull base=11451;
ull jz[MAXN];
string s;
set<ull> jihe;
vector<int> vec;
int n;
void has()
{
for (int i=1;i<=n;i++)
{
a[i]=a[i-1]*base+s[i];
}
for (int i=n;i>=1;i--)
{
b[i]=b[i+1]*base+s[i];
}
}
int main()
{
cin>>n;
char c;
s+=" ";
for (int i=1;i<=n;i++)
{
cin>>c;
s+=c;
}
jz[0]=1;
for (int i=1;i<=10000000;i++)
{
jz[i]=jz[i-1]*base;
}
has();
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j+=i)
{
ull ss=a[j]-a[j-i]*jz[i];
ull gg=b[j-i+1]-b[j+1]*jz[i];
ull sg=ss*gg;
jihe.insert(sg);
}
if(jihe.size()>ans)
{
ans=jihe.size();
vec.clear();
vec.push_back(i);
}
else if(jihe.size()==ans)
{
vec.push_back(i);
}
jihe.clear();
}
cout<<ans<<" "<<vec.size()<<endl;
for (int i:vec)
{
cout<<i<<" ";
}
return 0;
}