POJ 2406 Power Strings(KMP+最小循环节)

来源:互联网 发布:手机淘宝排名提升 编辑:程序博客网 时间:2024/05/17 07:13

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.


题解:

给一个串,问是由最多几个循环节组成的,直接用最小循环节长度len-next[len]判断一下就好了,如果能整除len就输出len/最小循环节长度,否则输出1

代码:

#include<algorithm>#include<iostream>#include<cstring>#include<stdio.h>#include<math.h>#include<string>#include<stdio.h>#include<queue>#include<stack>#include<map>#include<vector>#include<deque>using namespace std;#define lson k*2#define rson k*2+1#define M (t[k].l+t[k].r)/2#define INF 1008611111#define ll long long#define eps 1e-15int Next[1000005];char T[1000005];void init(){    int i=0,j=-1;    Next[0]=-1;    while(T[i])    {        if(j==-1||T[i]==T[j])        {            i++;            j++;            Next[i]=j;        }        else            j=Next[j];    }}int main(){    int i,j,n,len;    while(gets(T)!=NULL)    {        if(T[0]=='.')            break;        init();        len=strlen(T);        n=len-Next[len];        if(len%n==0)            printf("%d\n",len/n);        else            printf("1\n");    }    return 0;}