KMP前缀数组的理解与应用(三)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define N 1000010
char s[N];
int next[N];
void Creat_next(int n)
{
int j=0;
for(int i=1; i<n; i++)
{
while(j>0&&s[i]!=s[j])
j=next[j-1];
if(s[i]==s[j])
j++;
next[i]=j;
}
}
int main()
{
int n,k=0;
while(scanf("%d",&n),n!=0)
{
scanf("%s",s);
Creat_next(n);
printf("Test case #%d\n",++k);
for(int i=2;i<=n;i++)
{
if(i%(i-next[i-1])==0&&i/(i-next[i-1])!=1)
printf("%d %d\n",i,i/(i-next[i-1]));
}
printf("\n");
}
return 0;
}