Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 41250 | Accepted: 17150 |
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
abcdaaaaababab.
Sample Output
143
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
题解:
本来想找后缀数组的题,发现可以用hash来O(n)解决。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 typedef unsigned long long ULL;11 const ULL BASE=127;12 const int maxn=2000000;13 char s[maxn];14 int len;15 ULL base[maxn],hash[maxn];16 inline ULL get_hash(int l,int r){17 return hash[r]-hash[l-1]*base[r-l+1];18 }19 int main(){20 base[0]=1; for(int i=1;i<=1000000;i++) base[i]=base[i-1]*BASE;21 for(;;){22 scanf("%s",s+1); len=strlen(s+1);23 if(s[1]=='.') break;24 for(int i=1;i<=len;i++) hash[i]=hash[i-1]*BASE+s[i]-'a'+1;25 bool vis=false;26 for(int i=len-1;i>=1;i--){27 if(get_hash(1,i)==get_hash(len-i+1,len)&&len%(len-i)==0){28 vis=true;29 printf("%d\n",len/(len-i));30 break; 31 }32 }33 if(vis==false) puts("1");34 }35 return 0;36 }