hdoj3746(kmp算法的nex数组求最小循环节)

Posted frankchen831x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdoj3746(kmp算法的nex数组求最小循环节)相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/problem/HDU-3746

题意:给定一个字符串,问最少在两端添加多少元素使得整个字符串是呈周期性的。

思路:

  应用到kmp中nex数组的性质,数组的最小循环节是L=len-nex[len],证明见http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html。

  如果len%L==0,那么输出0.

  否则输出L-len%L。

AC代码:

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

const int maxn=1e5+5;
int T,len,nex[maxn];
char s[maxn];

void get_next(){
    int j;
    j=nex[0]=-1;
    for(int i=1;i<len;++i){
        while(j>-1&&s[i]!=s[j+1]) j=nex[j];
        if(s[i]==s[j+1]) ++j;
        nex[i]=j;
    }
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        len=strlen(s);
        get_next();
        int t1=len-1,t2=nex[t1];
        if(t2==-1){
            printf("%d
",len);
        }
        else{
            int t3=len-(t2+1);
            if(len%t3==0){
                printf("0
");
            }
            else{
                printf("%d
",t3-len%t3);
            }
        }
    }
    return 0;
}

 

以上是关于hdoj3746(kmp算法的nex数组求最小循环节)的主要内容,如果未能解决你的问题,请参考以下文章

poj2185(kmp算法next数组求最小循环节,思维)

HDU 3746 - Cyclic Nacklace - [KMP求最小循环节]

hdoj 3746(kmp)

hdu 3746 Cyclic Nacklace (KMP求最小循环节)

hdu3746 kmp求循环节

HDU 3746 Cyclic Nacklace(KMP求循环节)