题意:一个字符串,从字符串的第二个开始,看前面是否循环串,是就输出此时的位置,循环串的周期,周期必须大于1
next数组,len-next[i]为此字符串的最小循环节。另外,如果有len%(len-next[i])=0,此字符串的最小周期就为 len/(len-next[i]).
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1000100
int next[maxn];
char str[maxn];
int len;
void getnext()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||str[i]==str[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int main()
{
int n,i;
int t=0;
while(~scanf("%d",&n),n)
{
scanf("%s",str);
len=n;
memset(next,0,sizeof(next));
getnext();
printf("Test case #%d\n",++t);
for(i=2;i<=n;i++)
{
if(i%(i-next[i])==0&&next[i])
printf("%d %d\n",i,i/(i-next[i]));
}
printf("\n");
}
return 0;
}