【HDU 3746 Cyclic Nacklace 】 KMP

HDU3746
本题题意为添加最少的字符使原字符串变成周期至少为2的循环字符串
用到模板里所说的,长度为len的字符串的最小循环节为len-next[len],求出最小循环节,算出最后应该补充多少就结束了。
求最小循环节的证明法请看此链接KMP求字符串最小循环节
HDU3746代码

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn];
char str[maxn];
char mo[maxn];
int n1,n2;
void GetNext()
{
    int i=0,j=-1;
    while(i<n2)
    {
        if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;}
        else j=Next[j];
    }
    return ;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",mo);
        n2=strlen(mo);
        Next[0]=-1;
        GetNext();
        int tmp=n2-Next[n2];
        if(n2%tmp==0&&n2!=tmp)
        {
            printf("0\n");
        }
        else
        {
            printf("%d\n",tmp-n2%tmp);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/80501662
今日推荐