题意:给你一个字符串,求所有前缀循环次数大于等于2次的前缀
题解:对next数组的理解。next数组就是求当前位置的后缀与从头开始的前缀匹配程度,设j=i-next[i],若i%j==0说明肯定有循环节,且循环长度为j,次数为i/j。
AC代码:
#include<stdio.h>
#include<string.h>
#define N 1000005
char a[N],b[N];
int next[N];
void get_next(int l)
{
next[0]=-1;
int i=1,j=0;
while(i<l)
{
if(j==-1||b[i]==b[j])
next[++i]=++j;
else j=next[j];
}
}
int main()
{
int n;
int e=1;
while(~scanf("%d",&n))
{
if(n==0)break;;
scanf("%s",b);
int l=strlen(b);
get_next(l);
printf("Test case #%d\n",e++);
for(int i=1;i<=l;i++)
if(next[i]!=0&&i%(i-next[i])==0)
printf("%d %d\n",i,i/(i-next[i]));
printf("\n");
}
}