给出一个字符串,找出所有可以作为它循环节的子串长度

利用kmp的失配数组的性质,可以直接做

 #include<stdio.h>
#include<string.h> const int maxm=1e6+; char t[maxm];
int p[maxm]; int main(){
int m;
int cnt=;
while(scanf("%d",&m)!=EOF&&m){
int i,j;
scanf("%s",t);
p[]=p[]=;
for(i=;i<m;i++){
j=p[i];
while(j&&t[i]!=t[j])j=p[j];
p[i+]=t[i]==t[j]?j+:;
}
printf("Test case #%d\n",++cnt);
for(int i=;i<=m;++i){
if(p[i]!=&&!(p[i]%(i-p[i])))printf("%d %d\n",i,p[i]/(i-p[i])+);
}
printf("\n");
}
return ;
}
05-11 13:48