【HDU 3746 KMP之next】

来源:互联网 发布:高清网络摄像机方案 编辑:程序博客网 时间:2024/06/03 22:46

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746

注意理解:

next[ ]存的是前缀和后缀的最大匹配值,

length=len-next[], 是循环节。
len%(len-next[])==0
为最大循环节。
length - next[len] % length就是需要添加的字符个数。

总的表达式就是:

len-next[len]-(len%(len-next[len]))

#include<iostream>#include<cstdio>#include<cstring>using namespace std;char s[100005];int next[100005];void getnext(char *s,int *next){    int len=strlen(s);    int i=0,j=-1;    next[0]=-1;    while(i<len){        if(j==-1 || s[i]==s[j]){            i++;            j++;            next[i]=j;        }        else            j=next[j];    }}int main(){    int test;    scanf("%d",&test);    while(test--){        scanf("%s",s);        getnext(s,next);        int len=strlen(s);        int length,add;        length = len - next[len]; //循环节的长度        if(len != length && len % length == 0) //循环多次            printf("0\n");        else        {            add = length - next[len] % length; //取余的作用:abcab,去掉abc            printf("%d\n",add);        }        /*        if(next[len]>0 && len%(len-next[len])==0)            printf("0\n");        else            printf("%d\n",len-next[len]-(len%(len-next[len])));            */    }}