POJ 2406 Power Strings(KMPnext数组的应用)

题意:题目很短,我们先来猜一波题意,看样例我们口胡一波,可能是求一个字符串S,最多是由一个字符串复制几次得到

思路:队里kmp都不怎么好,抽时间学一下(多谢神犇们的博客,传送门),我们了解了题意之后,我们利用kmp的next数组性质可以容易的得到一个串S的最小循环节是|S|-next[s]得到的,如果得到的循环节长度可以被|S|整出,那么我们可以得到一个最小循环节,如果不能整除,则表示我们需要增加一些字符串使其形成新的循环节

代码:(get新技能,退役老年人手撕next数组)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn=1e6+7;
char a[maxn];
int next[maxn];
int len;
void getnext()
{
    int j=0,k=-1;
    next[0]=-1;
    while(j<len){
        if(a[j]==a[k]||k==-1)next[++j]=++k;
        else k=next[k];
    }
}
int main()
{
    while(~scanf("%s",a)){
        if(a[0]=='.')break;
        len=strlen(a);
        getnext();
        int ans=len-next[len];
        if(len%ans)puts("1");
        else{
            printf("%d
",len/ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lalalatianlalu/p/9640776.html