POJ 2406 Power Strings(kmp)

来源:互联网 发布:光纤网络是哪个公司的 编辑:程序博客网 时间:2024/05/17 01:20

Language:
Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 33335 Accepted: 13852

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

Waterloo local 2002.07.01


求一个串的最小周期


对于一个串,如果abcdabc 那么next[len]=3,那么len-next【len】就大于len/2,那么len%(len-next[len])!=0;而对于一个周期串ababab next[len]=4,此时len-next[len]应该等于

最小串的长度,所以是不是有最小周期就可以用len%(len-next[len])是否为0来判断,(个人理解,如有错,请想告)



#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define eps 1e-8using namespace std;#define N 100005char a[N];int len,next[N];void getfail(char *a){ int i,j; len=strlen(a); i=0;j=-1; next[0]=-1; while(i<len) { if(j==-1||a[i]==a[j]){ i++; j++; next[i]=j;}elsej=next[j]; }}int main(){int i,j;while(scanf("%s",a)){if(a[0]=='.') break;getfail(a);int ans=len%(len-next[len]);if(ans==0)printf("%d\n",len/(len-next[len]));elseprintf("1\n");}return 0;}






1 0