(POJ2406)Power Strings <KMP算法求最小循环节>

来源:互联网 发布:东阳司法拍卖网淘宝网 编辑:程序博客网 时间:2024/05/18 03:29

Power Strings
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

abcd
aaaa
ababab
.
Sample Output

1
4
3
Hint

This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source

Waterloo local 2002.07.01

题意:
就是一道求s 最小循环节的题,输出循环的最大次数。

分析:
KMP算法中,f[i]数组存的是[0,i)的最长真前缀等于最长真后缀的长度。那么若前i个字符组成的前缀是循环的,那么i%(i-f[i])==0 一定成立。 错位部分就是循环节。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1000010;char s[maxn];int f[maxn];void getfail(char* p){    int n = strlen(p);    f[0] = f[1] = 0;    for(int i=1;i<n;i++)    {        int j = f[i];        while(j && p[i]!=p[j]) j = f[j];        f[i+1] = p[i]==p[j] ? j+1 : 0;    }}int main(){    while(scanf("%s",s)!=EOF)    {        if(strcmp(s,".")==0) break;        getfail(s);        int n = strlen(s);        if(f[n] > 0 && n%(n-f[n])==0) printf("%d\n",n/(n-f[n]));        else printf("1\n");    }    return 0;}
0 0
原创粉丝点击