标签:
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 16462 | Accepted: 7903 |
Description
Input
Output
Sample Input
3
aaa
12
aabaabaabaab
0
Sample OutputTest case #1
2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题目链接:http://poj.org/problem?id=1961
把主串的每一种前缀当作小主串,判断小主串是否为子串的叠加,如果len-next[len]能被len整除,则该小主串是由长度为len-next[len]的子串len/(len-next[len])次叠加组成的
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxs = 1000010; 7 int Next[maxs]; 8 char s[maxs]; 9 int N; 10 void get_next() 11 { 12 int i = 0, j = -1; 13 Next[0] = -1; 14 while(i < N) 15 { 16 if(j == -1 || s[i] == s[j]) 17 { 18 i++; 19 j++; 20 Next[i] = j; 21 } 22 else 23 j = Next[j]; 24 } 25 } 26 int main() 27 { 28 //freopen("poj1961.txt","r",stdin); 29 int k = 0; 30 while(~scanf("%d",&N) && N != 0) 31 { 32 scanf("%s",s); 33 k++; 34 get_next(); 35 cout << "Test case #" << k << endl; 36 for(int i = 1; i <= N; i++) 37 { 38 if(Next[i] != 0 && i%(i-Next[i]) == 0) 39 cout << i << ‘ ‘ << i/(i-Next[i]) << endl; 40 } 41 cout << endl; 42 } 43 }
标签:
原文地址:http://www.cnblogs.com/Mino521/p/5758126.html