Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 43514 | Accepted: 18153 |
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
题目链接:http://poj.org/problem?id=2406
KMP算法,next表示模式串如果第i位(设str[0]为第0位)与文本串第j位不匹配则要回到第next[i]位继续与文本串第j位匹配。则模式串第1位到next[n]与模式串第n-next[n]位到n位是匹配的。如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。对于一个串,如果abcdabc, 那么next[len]=3,那么len-next【len】就大于len/2,那么len%(len-next[len])!=0;而对于一个周期串ababab next[len]=4,此时len-next[len]应该等于最小串的长度,最小周期就可以用len%(len-next[len])是否为0来判断。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 typedef long long ll; 8 typedef unsigned long long ull; 9 typedef long double ld; 10 const int maxn = 1000010; 11 char str[maxn]; 12 int Next[maxn]; 13 int len; 14 void get_next() 15 { 16 int j = -1; 17 int i = 0; 18 Next[0] = 0; 19 while(i < len) 20 { 21 if(str[i] == str[j] || j == -1) 22 { 23 i++; 24 j++; 25 if(str[i] != str[j]) 26 Next[i] = j; 27 else 28 Next[i] = Next[j]; 29 } 30 else 31 j = Next[j]; 32 } 33 } 34 35 int main() 36 { 37 while(~scanf("%s",str)) 38 { 39 if(str[0] == ‘.‘) 40 break; 41 len =strlen(str); 42 get_next(); 43 int ans = 1; 44 if(len%(len-Next[len]) == 0) 45 ans = len/(len-Next[len]); 46 //for(int g = 0; g <= len; g++) 47 //{ 48 // cout << Next[g] << ‘ ‘; 49 //} 50 //cout << endl; 51 cout << ans << endl; 52 } 53 return 0; 54 }