poj2406——Power Strings(KMP)

来源:互联网 发布:招商局集团 知乎 编辑:程序博客网 时间:2024/04/30 13:14
Power Strings
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 25855Accepted: 10829
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

解析:

         kmp的经典应用。。。

代码:

#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;char s[1000010];int next[1000010];int len;void read(){    freopen("poj2406.in","r",stdin);    freopen("poj2406.out","w",stdout);}int get_next(){    int i=0,j=-1;    next[i]=j;    while(i<len)    {        if(j==-1 || s[i]==s[j])        {            i++;j++;            next[i]=j;        } else        j=next[j];    }    i=len-j;    if(len%i==0)return len/i;    else return 1;}int main(){    read();    while(scanf("%s\n",s)!=EOF)    {        if(s[0]=='.')break;        len=strlen(s);        printf("%d\n",get_next());    }    return 0;}


原创粉丝点击