POJ 2406Power Strings

来源:互联网 发布:手机淘宝店铺关注链接 编辑:程序博客网 时间:2024/06/03 17:14

2016暑期集训7-A

POJ 2406 Power Strings

kmp变形,next数组的应用

传送门:关于kmp算法
传送门:POJ
传送门:HustOJ


题意

给一字符串,寻找最小的循环节最多循环多少次才能构成这个字符串。输出次数。
比如‘aaaa’由4个‘a’构成,循环节出现4次;‘abababababab’最短循环节‘ab’出现6次。


思路

kmp中的next数组作用就是找循环节,把题给字符串当成匹配字符串,kmp[n]表示前面多少个字符平移后与后面的相同,搞一搞就是循环节长度,就是k/(k-ne_xt[k-1])


代码

#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <stack>#include <vector>using namespace std;const int MAXN=1000007;const int oo=999999999;const long long int loo=10000000000000000ll;char P[MAXN];int ne_xt[MAXN];void getNext()//kmp求next{    int q,k;    int m=strlen(P);    ne_xt[0]=0;    for(q=1,k=0; q < m; ++q)    {        while(k > 0 && P[q] != P[k])            k=ne_xt[k-1];        if(P[q] == P[k])        {            k++;        }        ne_xt[q]=k;    }}int main(){    memset(P,0,sizeof(P));    while(~scanf("%s",P))    {        if(strcmp(P,".")==0)        {            return 0;        }        memset(ne_xt,0,sizeof(ne_xt));        int k=strlen(P);        getNext();        if((k%(k-ne_xt[k-1]))==0)        {            printf("%d\n",k/(k-ne_xt[k-1]));        }        else        {            printf("1\n");        }        memset(P,0,sizeof(P));    }}
0 0