POJ——T 1961 Period
阿新 • • 發佈:2017-08-17
lar height cond period ber space namespace ace script
,that is A concatenated K times, for some string A. Of course, we also want to know the period K.
number zero on it.
http://poj.org/problem?id=1961
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 18542 | Accepted: 9007 |
Description
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 AKInput
The input 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 theOutput
For 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
Source
Southeastern Europe 2004 next數組的應用,代碼意會吧、、1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N(1000000+5); 8 int len,p[N]; 9 char s[N]; 10 11 inline void Get_next() 12 { 13 for(int j=0,i=2;i<=len;p[i++]=j) 14 { 15 for(;s[i]!=s[j+1]&&j>0;) j=p[j]; 16 if(s[i]==s[j+1]) j++; 17 } 18 } 19 20 int main() 21 { 22 for(int i=0;scanf("%d",&len)&&len;) 23 { 24 scanf("%s",s+1); 25 memset(p,0,sizeof(p)); 26 Get_next(); 27 printf("Test case #%d\n",++i); 28 for(int i=1;i<=len;i++) 29 { 30 int l=i-p[i]; 31 if(i!=l&&i%l==0) 32 printf("%d %d\n",i,i/l); 33 } 34 printf("\n"); 35 } 36 return 0; 37 }
POJ——T 1961 Period