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 }