1 #include<stdio.h> 2 #include<string.h> 3 const int N = 1000010; 4 int f[N]; 5 void KMP_getFail(char *s) { 6 f[0] = -1; 7 for(int i = 0 , j = -1; s[i];) { 8 if(j == -1 || s[i] == s[j]) { 9 ++i, ++j; 10 f[i] = j; 11 //if(s[i] != s[j]) f[i] = j; 12 //else f[i] = f[j]; 13 } 14 else j = f[j]; 15 } 16 } 17 18 int KMP_find(char *s1,char *s2) { 19 int len = strlen(s2); 20 KMP_getFail(s2); 21 for(int i = 0, j = 0; s1[i];) { 22 if(j == -1 || s1[i] == s2[j]) { ++i, ++j; } 23 else j = f[j]; 24 if(j == len) return 1; 25 } 26 return 0; 27 } 28 29 int main() { 30 char s[N]; 31 int kase = 0, len; 32 while(scanf("%d", &len) , len) { 33 scanf("%s", s); 34 printf("Test case #%d\n", ++kase); 35 KMP_getFail(s); 36 for(int i = 1; i <= len; ++i) { 37 if(f[i] && i % (i - f[i]) == 0) 38 printf("%d %d\n", i, i / (i - f[i])); 39 } 40 printf("\n"); 41 } 42 return 0; 43 }