和poj 2046一样,多加了一维
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char p[1000050];
int next[1000050];
int n;
void getnext()
{
int k=-1,j=0;
next[0]=-1;
while(j<n){
if(k==-1 || p[k] == p[j]){
k++;
j++;
next[j]=k;
}
else {
k=next[k];
}
}
}
int main()
{
int t=0;
while(scanf("%d",&n),n){
memset(next,0,sizeof(next));
memset(p,0,sizeof(p));
t++;
int i,j,k;
scanf("%s",p);
getnext();
printf("Test case #%d\n",t);
for(i=2;i<=n;i++)
if(i%(i-next[i])==0 && next[i]!=0)
printf("%d %d\n",i,i/(i-next[i]));
printf("\n");
}
}