题目地址 :http://poj.org/problem?id=1961
KMP 前缀数组 NEXT 的使用 。
和这题: http://blog.youkuaiyun.com/diannaok/article/details/7887809 一样。
#include<cstdio>
const int MAXN = 1000100;
int nxt[MAXN];
int get_next(char *ptr){
int i,j;
nxt[0]=0;
for(i=1;ptr[i];i++){
j=nxt[i-1];
while(ptr[i]!=ptr[j] && j)
j=nxt[j-1];
nxt[i]=ptr[i]==ptr[j]?j+1:0;
}
return i;
}
char s[MAXN];
int main(){
int i,len,mx,tt=1;
while(~scanf("%d",&len),len){
scanf("%s",s);
get_next(s);
printf("Test case #%d\n",tt++);
for(i=2;i<=len;i++)
if(i%(i-nxt[i-1])==0 && nxt[i-1]+nxt[i-1]>=i)
printf("%d %d\n",i,i/(i-nxt[i-1]));
puts("");
}
return 0;
}
//ababa