题意:
给出一个字符串,求它循环的每个位置和循环的周期。
如aabaabaabaab,第六个位置b,aab是一个循环,共有两个循环,故输出6 2
第二个位置,a是一个循环,共有两个循环,故输出2 2
匹配,kmp,只有本身一个串,得到next数组再判断
//求循环周期
#include<stdio.h>
#include<string.h>
#define maxn 1000010
int next[maxn];
char str[maxn];
void getnext(char *str,int len)
{
int i=1,j=0;
next[1]=0;
while(i<=len)
{
if(j==0||str[i]==str[j])
next[++i]=++j;
else j=next[j];
}
}
int main()
{
int T=1,len;
while(scanf("%d",&len)!=EOF)
{
if(len==0)break;
memset(next,0,sizeof(next));
scanf("%s",str+1);
getnext(str,len);
printf("Test case #%d\n",T++);
for(int i=2;i<=len+2;i++)
{
int num=i-(next[i+1]-1);//相隔多少个字母
if(i!=num&&i%num==0)//整除了,说明是周期的
printf("%d %d\n",i,i/num);
}
printf("\n");
}
return 0;
}