首页 > 代码库 > poj2406--Power Strings(KMP求最小循环节)

poj2406--Power Strings(KMP求最小循环节)

Power Strings
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 33178 Accepted: 13792

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

用next数组求出整个数组的最大前缀,如果整个串是用循环节组成的,那么 n - next[n] 也就是最小循环节,验证最小循环节会被n整出。

 

#include <cstdio>#include <cstring>#include <algorithm>int next[1100000] ;char str[1100000] ;void getnext(int l){    int j = 0 , k = -1 ;    next[0] = -1 ;    while(j < l)    {        if( k == -1 || str[j] == str[k] )        {            j++ ;            k++ ;            next[j] = k ;        }        else            k = next[k] ;    }}int main(){    int l , m ;    while(scanf("%s", str)!=EOF)    {        if( str[0] == '.' ) break;        l = strlen(str);        getnext(l) ;        m = next[l];        if( l % (l-m) != 0 )            printf("1\n");        else        {            m = l / ( l-m );            printf("%d\n", m);        }        memset(str,0,sizeof(str));    }    return 0;}


 

poj2406--Power Strings(KMP求最小循环节)