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;}
Poj 2406 power strings [KMP]