poj2406 Power Strings

【题意】

字符串从头开始最多有多少个重复片段

【分析】

求出nxt数组,看总长度是不是最长能重复多少的倍数,如果是则说明有循环节,总长度处于循环节长度即可

如果不能整除说明循环节只有几个

【代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
char s[maxn];
int nxt[maxn];
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    while(scanf("%s",s) && s[0]!='.')
    {
        int len=strlen(s);
        nxt[0]=-1;
        int j=0,k=-1;
        while(j<len)
        {
            if(k==-1 || s[j]==s[k])
            {
                j++;
                k++;
                nxt[j]=k;
            }
            else k=nxt[k];
        }
        int ans=1;
        if(len%(len-nxt[len])==0)
            ans=len/(len-nxt[len]);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2021-04-27 19:31  andyc_03  阅读(26)  评论(0编辑  收藏  举报