Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 23735 | Accepted: 9978 |
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.
Source
题意:给出一个字符串S,求该字符串最多是由相同重复字串连接而成的
若S由n个A组成,则称 S = A^n,求最大的n
若S由n个A组成,则称 S = A^n,求最大的n
如 S=aaa,S="a"^3 => n = 3;
S=ababa => n = 1
S=ababab=>"ab"^3=>n=3
code:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 int Next[1000010]; 6 char str[1000010]; 7 int len; 8 9 void getnext() 10 { 11 int j=0; 12 int k=-1; 13 Next[0]=-1; 14 while(j<len) 15 { 16 if(k==-1||str[k]==str[j]) 17 { 18 k++; 19 j++; 20 Next[j]=k; 21 } 22 else 23 k=Next[k]; 24 } 25 } 26 27 int main() 28 { 29 int ans; 30 while(~scanf("%s",str)) 31 { 32 if(str[0]=='.') 33 break; 34 len=strlen(str); 35 getnext(); 36 if(len%(len-Next[len])==0) 37 { 38 ans=len/(len-Next[len]); 39 printf("%d\n",ans); 40 continue; 41 } 42 printf("1\n"); 43 } 44 return 0; 45 }