Period HDU - 1358
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as A K
InputThe input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on it.
OutputFor each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
活用kmp中記錄位置的數組
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 7 int n; 8 int nxt[1000005]; 9 char s[1000005]; 10 11 void getNext(char*s){ 12 nxt[0]=-1; 13 int lens=strlen(s); 14 for(int i=0;i<lens;i++){ 15 int k=nxt[i]; 16 while(k!=-1&&s[i]!=s[k]) k=nxt[k]; 17 nxt[i+1]=k+1; 18 } 19 } 20 21 int main() 22 { 23 while(~scanf("%d",&n)&&n!=0){ 24 scanf("%s",s); 25 getNext(s); 26 static int t=0;printf("Test case #%d\n",++t); 27 for(int i=1;i<n;i++){ 28 int len=i+1; 29 if(nxt[len]!=0){ 30 if(len%(len-nxt[len])==0) printf("%d %d\n",len,len/(len-nxt[len])); 31 } 32 } 33 printf("\n"); 34 } 35 }
Period HDU - 1358