POJ 2406 Power Strings [KMP+循环节规律]

来源:互联网 发布:手机查看守望先锋数据 编辑:程序博客网 时间:2024/04/30 13:30

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.

题目大意:给一个字符串,要求这个字符串是由多少个连续的子串组成的;

题解:对于next数组, next[len]就是最后一个字符的位置,如果他有相同的子串,则            长度为len-next[len] 所以只需要把next数组求出来然后取余判断,如果没有相              同的,则只有他自己,即为1;

AC代码:

#include <iostream>#include <cmath>#include<cstdio>#include <cstring>#include <algorithm>#define N 10000005using namespace std ;char a[N] ;int len , n , next[N];void kkk(){    int i , j ;    i = 0;    j = next[0] = -1;    while(i < len)    {        while(j!=-1&&a[i]!=a[j])             j = next[j];        next[++i] = ++j;    }}int main(){    while(scanf("%s",a))    {        if(a[0]=='.') break;        len = strlen(a);        memset(next,0,sizeof(next));        kkk();        int ans ;        if(len%(len-next[len])==0) ans = len/(len-next[len]);        else ans = 1;        cout<<ans<<endl;    }    return 0 ;}

0 0
原创粉丝点击