1 数据范围较大,故用KMP求循环节 2 3 之后由小到大枚举长度范围,若该长度下有循环节就输出答案 4 5 还要注意输出格式。之前测试时候连着一串presentation error也是悲伤 6 7 8 #include<bits/stdc++.h> 9 using namespace std; 10 char c[1000500]; 11 int ne[1000500]; 12 int n; 13 void kmp(char s[]){ 14 ne[0]=0;//题目要求最小循环长度为2 15 ne[1]=0; 16 int i,j; 17 for(i=1;i<n;i++){ 18 j=ne[i]; 19 while(j && c[i]!=c[j])j=ne[j]; 20 if(c[i]==c[j])j++; 21 ne[i+1]=j; 22 } 23 return; 24 } 25 int main(){ 26 int T=1; 27 while(scanf("%d",&n) && n){ 28 printf("Test case #%d ",T++); 29 scanf("%s",c); 30 kmp(c); 31 int i; 32 for(i=2;i<=n;i++){//查找循环节 33 if(ne[i] && i%(i-ne[i])==0) 34 printf("%d %d ",i,i/(i-ne[i])); 35 } 36 printf(" "); 37 } 38 return 0; 39 }