KMP的第一题,以前数据结构课上学过KMP,现在对其实现和其中一些规律加深了理解
#include<stdio.h>
char s[1000005];
int next[1000005];
int n;
void get_next(){
int i,j;
j=next[0]=-1;
i=0;
while(i<n){
while(j!=-1 && s[j]!=s[i]) j=next[j];
next[++i]=++j;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int cas=0;
while(scanf("%d",&n),n){
printf("Test case #%d\n",++cas);
scanf("%s",s);
get_next();
int j;
for(int i=2;i<=n;i++){//这里的i是表长度,不是指针
j=i-next[i];
if(i%j==0&&i/j>1) printf("%d %d\n",i,i/j);
}
printf("\n");
}
return 0;
}