POJ---2406 Power Strings[求最长重复字串]

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=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 }

 

posted @ 2012-09-04 01:56  max_xbw  阅读(323)  评论(0编辑  收藏  举报