KMP与扩展KMP

来源:互联网 发布:echo linux 写入文件 编辑:程序博客网 时间:2024/04/30 15:51

KMP

next数组 表示:
next[i] -> T[1…i-1] 前缀 与 T[1…i-1] 后缀相同的最大长度
next[next[i]] 次大长度

扩展KMP

next数组 表示:
next[i]-> T[i….m] 与 T的最大公共前缀长度
extend[i] -> S[i….m] 与 T的最大公共前缀长度

next是T与T自身得到的特殊的extend

模板:

int next[MAXN];int extend[MAXN];void EKMP(char s[],char t[])//s[]为主串,t[]为模式串{    int i,j,p,l;    int len=strlen(t);    int len1=strlen(s);    memset(next,0,sizeof(next));    memset(extend,0,sizeof(extend));    next[0]=len;    j=0;    while(j+1<len&&t[j]==t[1+j])j++;    next[1]=j;    int a=1;    for(int i=2;i<len;i++)    {        p=next[a]+a-1;        l=next[i-a];        if(i+l<p+1)next[i]=l;        else        {            j=max(0,p-i+1);            while(i+j<len&&t[i+j]==t[0+j])j++;            next[i]=j;            a=i;        }    }    j=0;    while(j<len1&&j<len&&s[j]==t[j])j++;    extend[0]=j;    a=0;    for(i=1;i<len1;i++)    {        p=extend[a]+a-1;        l=next[i-a];        if(l+i<p+1)next[i]=l;        else        {            j=max(0,p-i+1);            while(i+j<len1&&j<len&&s[i+j]==t[j])j++;            extend[i]=j;            a=i;        }    }}

参考:ppt

0 0