水题,求循环节,没什么好说的
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int p[1000005];
char s[1000005];
int l;
void getnext()
{
for (int i=2;i<=l;i++)
{
int j=p[i-1];
while (j>0&&s[j+1]!=s[i])
j=p[j];
if (s[j+1]==s[i])
j++;
p[i]=j;
}
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
while (scanf("%s",s+1))
{
l=strlen(s+1);
if (l==1&&s[1]=='.')
break;
//cout<<l<<endl;
p[0]=p[1]=0;
getnext();
int ans=1;
/*
for (int i=1;i<=l;i++)
cout<<p[i]<<" ";
cout<<endl;
*/
for (int i=l;i>=l;i--)
{
if (p[i]!=0&&i%(i-p[i])==0)
ans=max(ans,i/(i-p[i]));
//cout<<i<<endl;
}
printf("%d\n",ans);
}
}