Fellow me on GitHub

POJ2406(SummerTrainingDay10-I KMP)

Power Strings

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 50036   Accepted: 20858

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

 
KMP找不可重叠的最小循环节
 1 //2017-08-10
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 const int N = 1000010;
10 char str[N];
11 int nex[N];
12 
13 void getNext(int n)
14 {
15     nex[0] = -1;
16     for(int i = 0, fail = -1; i < n;)
17     {
18         if(fail==-1||str[i]==str[fail])
19         {
20             i++, fail++;
21             nex[i] = fail;
22         }else fail = nex[fail];
23     }
24 }
25 
26 int main()
27 {
28     while(scanf("%s", str)!=EOF)
29     {
30         if(str[0] == '.')break;
31         int n = strlen(str);
32         getNext(n);
33         int ans = n-nex[n];
34         if(n%ans == 0)
35             printf("%d\n", n/ans);
36         else printf("1\n");
37     }
38 
39     return 0;
40 }

 

posted @ 2017-08-10 22:02  Penn000  阅读(114)  评论(0编辑  收藏  举报