hdu 3746 Cyclic Nacklace (kmp扩展—最小循环节)

来源:互联网 发布:网络本科学位证有用吗 编辑:程序博客网 时间:2024/05/21 06:36

题意:

给出字符串,求至少要加几个字符使得字符串能够成为循环的串。

题解:

最小循环节,首先我先YY证明一下最小循环节(想了好久),next数组存的是最长公共前后缀的长度,那么这个例子abcdab,next[len]=2,发现其实最小的循环节就是从开头到长度为2的部分+长度为2的部分到长度为2的后缀之前,也就是abcd是最下循环节。那么计算要加入几个就好办了

最小循环节:cir=len-next[len]

答案:ans=len-(len-cir*(len/cir))

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;//typedef long long lld;const int oo=0x3f3f3f3f;//const lld OO=1LL<<61;const int MOD=10007;const int maxn=100005;int next[maxn];char str[maxn];void get_next(int len){    int i=0;next[i]=-1;    int j=-1;    while(i<len)    {        if(j==-1||str[i]==str[j])        {            i++;            j++;            next[i]=j;        }        else j=next[j];    }}int main(){    int T,n;    scanf("%d",&T);    while(T--)    {        scanf("%s",str);        int len=strlen(str);        get_next(len);        int cir=len-next[len];        int ans;        if(cir!=len&&len%cir==0)            ans=0;        else            ans=cir-(len-cir*(len/cir));        printf("%d\n",ans);    }    return 0;}/**abcd-> abcdabcabcda*/




0 0