扩展KMP模板

来源:互联网 发布:python数据分析入门 编辑:程序博客网 时间:2024/06/06 05:47

扩展kmp

学习资料:

扩展kmp学习资料

关于扩展kmp:

定义母串S,和子串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前缀,也就是说,设extend数组,extend[i]表示T与S[i,n-1]的最长公共前缀,要求出所有extend[i](0<=i<n)。

时间复杂度分析:

下面来分析一下算法的时间复杂度,通过上面的算法介绍可以知道,对于第一种情况,无需做任何匹配即可计算出extend[i],对于第二种情况,都是从未被匹配的位置开始匹配,匹配过的位置不再匹配,也就是说对于母串的每一个位置,都只匹配了一次,所以算法总体时间复杂度是O(n)的,同时为了计算辅助数组next[i]需要先对字串T进行一次拓展kmp算法处理,所以拓展kmp算法的总体复杂度为O(n+m)的。其中n为母串的长度,m为子串的长度。

题型分析:

模板:

    #include <bits/stdc++.h>    using namespace std;    const int maxn=100010;    int next[maxn],ex[maxn]; //ex数组即为extend数组    //预处理计算next数组    void getnext(string str)    {        int i=0,j,po,len=str.size();        next[0]=len;//初始化next[0]        while(str[i]==str[i+1]&&i+1<len)//计算next[1]        i++;        next[1]=i;        po=1;//初始化po的位置        for(i=2;i<len;i++)        {            if(next[i-po]+i<next[po]+po)//第一种情况,可以直接得到next[i]的值            next[i]=next[i-po];            else//第二种情况,要继续匹配才能得到next[i]的值            {                j=next[po]+po-i;                if(j<0)j=0;//如果i>po+next[po],则要从头开始匹配                while(i+j<len&&str[j]==str[j+i])//计算next[i]                j++;                next[i]=j;                po=i;//更新po的位置            }        }    }    //计算extend数组    void exkmp(string s1,string s2)    {        int i=0,j,po,len=s1.size(),l2=s2.size();        getnext(s2);//计算子串的next数组        while(s1[i]==s2[i]&&i<l2&&i<len)//计算ex[0]        i++;        ex[0]=i;        po=0;//初始化po的位置        for(i=1;i<len;i++)        {            if(next[i-po]+i<ex[po]+po)//第一种情况,直接可以得到ex[i]的值            ex[i]=next[i-po];            else//第二种情况,要继续匹配才能得到ex[i]的值            {                j=ex[po]+po-i;                if(j<0)j=0;//如果i>ex[po]+po则要从头开始匹配                while(i+j<len&&j<l2&&s1[j+i]==s2[j])//计算ex[i]                j++;                ex[i]=j;                po=i;//更新po的位置            }        }    }    int main()    {        string s1,s2;//s1为母串 s2为子串        cin>>s1>>s2;        exkmp(s1,s2);        for(int i=0;i<s1.size();i++)            cout<<ex[i];        return 0;    }


原创粉丝点击