#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =10000100;
char s[M];
int fail[M];
int len;
void Fail()
{
int i=0,k=-1;
len=strlen(s);
fail[0]=-1;
while(i<len)
{
if(k==-1||s[i]==s[k])
{
fail[i+1]=k+1;
i++;
k++;
}
else
{
k=fail[k];
}
}
}
int main()
{
while(scanf("%s",s)!=EOF&&s[0]!='.')
{
Fail();
int ans=1;
// 123456
// 若fail[len]=5 -> 1234=3456 56=34 34=12
// len-fail[len] 错位部分即为循环节部分
if(len%(len-fail[len])==0)
ans=len/(len-fail[len]);
cout<<ans<<endl;
}
return 0;
}
poj 2406 KMP求循环节
最新推荐文章于 2018-09-10 17:45:36 发布