poj 2406 Power Strings(kmp next数组的应用)

来源:互联网 发布:全文翻译的软件 编辑:程序博客网 时间:2024/05/22 15:55

分析转自:http://www.cnblogs.com/zhanzhao/p/4761477.html

大意:给出一个字符串 问它最多由多少相同的字串组成 

如  abababab由4个ab组成

 

分析:

kmp中的next数组求最小循环节的应用

例如 

ababab  next[6] = 4; 即

 

ababab

   ababab

1~4位  与2~6位是相同的

 

 

那么前两位

就等于3、4位

3、4位就等于5、6位

……

所以 如果 能整除  也就循环到最后了

 

如果不能整除  

就最后余下的几位不在循环内

 

例如

1212121

  1212121

最后剩余1不能等于循环节


代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e6+5;char str[maxn];int next[maxn];void makeNext(void){    int len = strlen(str);    next[0] = next[1] = 0;    for(int i = 1; i < len; i++)    {        int j = next[i];        while(j && str[i] != str[j]) j = next[j];        next[i+1] = str[i]==str[j] ? j+1 : 0;    }}int main(void){    while(~scanf(" %s", str))    {        if(str[0] == '.') break;        makeNext();        int len = strlen(str);        if(len%(len-next[len]) == 0) printf("%d\n", len/(len-next[len]));        else puts("1");    }    return 0;}


Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 44865 Accepted: 18741

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

1 1
原创粉丝点击