Poj-2406-Power Strings【KMP】

来源:互联网 发布:数据挖掘试题和答案 编辑:程序博客网 时间:2024/05/15 02:36

传送门:http://poj.org/problem?id=2406常发生



Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 50464 Accepted: 21048

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

题意:拿第三组数据来看 找到子串ab 则s为ababab  a为ab  n为s除以a   

第二组数据 匹配子串为一个a(这里就是next数组的运用)s为aaaa  a为a  n为4

#include<cstdio>#include<cstring>#define M 1000005char s[M];int next[M];int len;void Next(){int i=0;int j=-1;next[0]=-1;j=next[i];while(i<len){if(j==-1||s[i]==s[j]){next[++i]=++j;//i++;j++;//next[i]=j;}elsej=next[j];}}int main(){while(scanf("%s",s)!=EOF){if(s[0]=='.')break;len=strlen(s);   //不能两次 int  Next();if(len%(len-next[len])==0)   //len-next[len]  求公共子串长度printf("%d\n",len/(len-next[len]));elseprintf("1\n");}return 0;}