Poj 2406 Power Strings [KMP], poj2406
Click to open the question
Power Strings
Time Limit:3000 MS |
|
Memory Limit:65536 K |
Total Submissions:33548 |
|
Accepted:13935 |
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 shoshould print the largest n such that s = a ^ n for some string.
Sample Input
abcdaaaaababab.
Sample Output
143
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed. returns a string with a length of no more than 10 ^ 6. returns the maximum n so that S is connected by n identical strings a, for example: "ababab" is composed of n = 3 "AB" connections. "aaaa" is composed of n = 4 "a" connections, "abcd" is connected by n = 1 "abcd.
Solution: if the length of S is len, then S has a circular substring. if and only, len can be divisible by len-next [len, the shortest loop substring is S [len-next [len]
The KMP algorithm is used to calculate the next feature vector of a string. If len can be divisible by len-next [len], the maximum number of loops n is len/(len-next [len]). otherwise, the value is 1.
#include<cstdio>#define maxn 1000002char str[maxn];int next[maxn],len,s;void GetNext(){ int i=0,j=-1; next[0]=-1; while(str[i]){ if(j==-1||str[i]==str[j]){ ++i;++j;next[i]=j; }else j=next[j]; } len=i;}int main(){ while(scanf("%s",str)==1){ if(str[0]=='.') break; GetNext(); s=len-next[len]; if(len%s==0) printf("%d\n",len/s); else printf("1\n"); }return 0;}