[POJ]2406Power Strings KMP

来源:互联网 发布:网络高清解码器 编辑:程序博客网 时间:2024/06/05 17:30
Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 49390 Accepted: 20575

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

[Submit]   [Go Back]   [Status]   [Discuss]

Home Page   Go Back  To top

跳next即可,n-nxt[n]一定是最小的循环节,若n不能整除它,那么就是1,有扩展欧几里得可得没必要从n跳前面的nxt.

#include<stdio.h>#include<cstring>using namespace std;char s[1000005];int nxt[1000005],lens;inline void init(){nxt[0]=-1;int i=0,j=-1;    lens=strlen(s);    while(i<lens){        if(s[i]==s[j]||j==-1) i++,j++,nxt[i]=j;else j=nxt[j];}}int main(){    while(scanf("%s",s)){    if(s[0]=='.') break;        init();        if(!(lens%(lens-nxt[lens]))) printf("%d\n",lens/(lens-nxt[lens]));        else puts("1");}}