和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");
	}
}