链接
http://poj.org/problem?id=1961
大意
给定字符串 ,求出字符串 的所有循环节和其长度
思路
代码
#include<cstdio>
using namespace std;int t,n,nxt[1000001],j;
char s[1000001];;
signed main()
{
while(scanf("%d",&n),n)
{
scanf("%s",s);j=0;
for(register int i=1;i<=n;i++) nxt[i]=0;
for(register int i=1;i<n;i++)
{
while(j&&s[i]!=s[j]) j=nxt[j];
if(s[i]==s[j])nxt[i+1]=++j;//求nxt数组
}
printf("Test case #%d\n",++t);//输出
for(register int i=2;i<=n;i++) if(i%(i-nxt[i])==0&&i/(i-nxt[i])>1) printf("%d %d\n",i,i/(i-nxt[i]));
putchar(10);//因为循环节只有可能是i的约数。。。
}
}