HDU - 1358 Period
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
前i個字符中循環體有多少個,在getnext中加入打印語句即可。
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 6 using namespace std; 7 8 char s[1000005]; 9 int Next[1000005]; 10int n; 11 void getNext() 12 { 13 int j,k; 14 j=0; 15 k=-1; 16 Next[0]=-1; 17 while(s[j]!=‘\0‘) 18 { 19 if(k==-1||s[j]==s[k]) 20 { 21 j++; 22 k++; 23 if(j%(j-k)==0&&j/(j-k)>1) 24 printf("%d %d\n",j,j/(j-k)); 25 Next[j]=k; 26 } 27 else k=Next[k]; 28 } 29 } 30 int main() 31 { 32 int Case=0; 33 while(scanf("%d",&n),n) 34 { 35 Case++; 36 scanf("%s",&s); 37 printf("Test case #%d\n",Case); 38 getNext(); 39 printf("\n"); 40 } 41 return 0; 42 }
HDU - 1358 Period