拓展KMP算法

来源:互联网 发布:机器人c语言编程实例 编辑:程序博客网 时间:2024/06/04 18:44

拓展kmp算法
刚开始看的时候有点看不懂,主要是拓展KMP这里的next数组和KMP算法中的next数组是不一样的
这里是我的代码模板:

#include<bits/stdc++.h>using namespace std;const int MAX_N = 1e5+9; // 字符串长度最大值int nxt[MAX_N] , ext[MAX_N];char t[27],tran[27],vec1[MAX_N],vec2[MAX_N];void get_next(char * str){    memset(nxt,0,sizeof(nxt));    int num=0,j,po = 1, len = strlen(str);    nxt[0] = len;    while(str[num+1] == str[num] && num+1 < len) num++; // 计算next[1];    nxt[1] = num;    // next[po] + po == P    for(int i=2 ;i<len;i++)    {        if(nxt[i-po]+i<nxt[po] + po)            nxt[i] = nxt[i-po];        else        {            j = nxt[po] + po - i;            if(j<0) j=0;            while(i+j < len && str[j] == str[i+j]) j++;            nxt[i] = j;            po = i;        }    }}void ekmp(char * s1,char *s2){    int num =0,j,po,len=strlen(s1),l2 = strlen(s2);    get_next(s2);    while(s1[num]==s2[num] && num<len && num<l2) num ++;    ext[0] = num ;    po = 0; //这里是0,因为get_next里面是两个相同的字符串,而这里是不同的字符串    for(int i=1;i<len;i++)    {        if(nxt[i-po]+i < ext[po]+po)            ext[i] = nxt[i-po];        else        {            j = ext[po]+po-i;            if(j<0) j=0;            while(i+j<len && j<l2 && s1[i+j] == s2[j]) j++;            ext[i] = j;            po = i;        }    }}int main(){    int N,M,T;    //freopen("in.txt","r",stdin);    cin>>T;    while(T--)    {        cin>>t>>vec1;        int len = strlen(vec1);        for(int i=0;i<26;i++) tran[t[i]-'a']=i+'a';        for(int i=0;i<(len+1)/2;++i)            vec2[i]=tran[vec1[i]-'a'];//将密文转换为明文,密文长度>=明文长度        for(int i=(len+1)/2;i<=len;i++) vec2[i]=vec1[i];        get_next(vec2);        int ans ;        for(ans=(len+1)/2;ans<len;ans++)        {            if(nxt[ans] == len - ans) break;        }        cout<<vec1;        for(int i=len-ans;i<ans;i++) cout<<tran[vec1[i]-'a'];        cout<<endl;    }    return 0;}
原创粉丝点击