HDU3746Cyclic Nacklace后缀补字母形成环

时间:2019-08-13
本文章向大家介绍HDU3746Cyclic Nacklace后缀补字母形成环,主要包括HDU3746Cyclic Nacklace后缀补字母形成环使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

(HDU3746Cyclic Nacklace)[http://acm.hdu.edu.cn/showproblem.php?pid=3746]

利用kmp的next求出循环的字符串个数
len-Next[len]就是循环字符串的长度,循环字符串下标是1-len-next[len]
然后字符串可能是已经循环的,一次循环或多次循环
或者不是循环的,长度对循环长度取余就是没有循环的字符长度,再用循环长度减去这个值就是答案

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char b[1000005];
int Next[1000005];
int len;
void getnext(){
    int p=0;//p是下标
    Next[1]=0;
    for(int i=2;i<=len;i++){
        while(p&&b[i]!=b[p+1]){
            p=Next[p];
        }
        if(b[p+1]==b[i])p++;
        Next[i]=p;
    }
}

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s",b+1);
        len=strlen(b+1);
        getnext();
        int circle=len-Next[len];//循环节
        int ans=0;
        if(len%circle==0){//循环节的倍数
            if(len==circle)ans=len;
            else ans=0;
        }else{//非循环节倍数
            ans=(-len)%circle+circle;
        }
        printf("%d\n",ans);

    }


    return 0;
}

原文地址:https://www.cnblogs.com/Emcikem/p/11344832.html