POJ 2406
Time Limit: 3000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
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.
________________________________________________________________________________________________________________________
题目大意:给定字符串,问字符串由几个相同的部分组成?
if(字符串长度%(字符串长度-字符串最后一个字符的next[])==0),相同部分的长度为:字符串长度-字符串最后一个字符的next[]
在做这个题目时处理低级失误,把长度L定义成了char,找了一个多小时,哎……,笨的要死了!
________________________________________________________________________________________________________________________
1 #include<cstdio> 2 #include<cstring> 3 4 using namespace std; 5 const int maxl=1000010; 6 char s[maxl]; 7 int next[maxl],l; 8 void getnext() 9 { 10 next[0]=-1; 11 for(int j,i=1;i<l;i++) 12 { 13 j=next[i-1]; 14 while(s[j+1]!=s[i] && j>=0)j=next[j]; 15 next[i]=s[j+1]==s[i]?j+1:-1; 16 } 17 } 18 int main() 19 { 20 while(~scanf("%s",s) ) 21 { 22 if(s[0]=='.')break; 23 l=strlen(s); 24 getnext(); 25 if(l%(l-next[l-1]-1)==0)printf("%d\n",l/(l-next[l-1]-1)); 26 else printf("1\n"); 27 } 28 return 0; 29 }