​题目链接:​

思路

哈希一下,然后分大小为k的块进行判断,从小到大取值即可

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef unsigned long long ll;
const ll base=13331;
ll h[maxn],p[maxn];
char s[maxn];
ll get(ll l,ll r)
{
return h[r]-h[l-1]*p[r-l+1];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>s+1&&s[1]!='.')
{
p[0]=1;
ll len=strlen(s+1);
for(int i=1; i<=len; i++)
{
h[i]=h[i-1]*base+s[i]-'a';
p[i]=p[i-1]*base;
}
ll maxx=1;
ll k=1;
while(1)
{
bool fla=true;
ll j,ans=1;
if(len%k==0)
{
j=len/k;
if(j==1)
break;
for(int i=1; i+2*k-1<=len; i+=k)
{
if(get(i,i+k-1)==get(i+k,i+2*k-1))
ans++;
else
{
fla=false;
break;
}
}
if(fla)
{
maxx=max(maxx,ans);
break;
}
}
k++;
}
cout<<maxx<<endl;
}
}