next数组得重要应用
i-f[i]表示可能的最小链节 如i%(i-f[i])是正整数的话
说明有多个循环节
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
char s[10005],t[1000010];
int f[1000010],n;
void getf()
{
f[0]=-1;f[1]=0;
int j=0,i=1;
while(i<n)
{
if(j==-1||t[i]==t[j])
{
j++;
i++;
f[i]=j;
}
else
{
j=f[j];
}
// if(j==-1){j=0;f[++i]=0;}
}
}
void kmp()
{
getf();
int m=(int)strlen(s);
if(m<n) return;
int j;
for(int i=0;i<m;i++)
{
j=0;
for(;j<n;j++)
{
if(s[i+j]!=t[j])
{
if(f[j]==-1){j=-1;break;}
else
{
i=j-f[j];
j=f[j];
}
}
}
if(j!=-1){printf("%d\n",i);}
}
}
int main()
{
int co=0;
// memset(s,0,sizeof s);
//memset(t,0,sizeof t);
/* scanf("%s%s",t,s);*/
// scanf("%s",t);
// n=(int)strlen(t);
while(~scanf("%d",&n),n)
{
// if(co){puts("");}
printf("Test case #%d\n",++co);
scanf("%s",t);
getf();
for(int i=2;i<=n;++i)
{
if(f[i]>0&&i%(i-f[i])==0)
printf("%d %d\n",i,i/(i-f[i]));
}
printf("\n");
}
return 0;
//kmp();
// printf("end\n");
}