*扩展KMP

来源:互联网 发布:三月软件小组 编辑:程序博客网 时间:2024/04/27 21:38
今天是2017/7/8,DCDCBigBig的第二十二篇博文

EXKMP(next+extend)

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int l1,l2,next[100001],extend[100001];char s[100001],t[100001];void getnext(){    int a=0,p;    next[0]=l2;    for(int i=1,j=-1;i<l2;i++,j--){        if(j<0||i+next[i-a]>=p){            if(j<0){                p=i;                j=0;            }            while(p<l2&&t[p]==t[j]){                p++;                j++;            }            next[i]=j;            a=i;        }else next[i]=next[i-a];    }}void getex(){    int a=0,p;    for(int i=0,j=-1;i<l1;i++,j--){        if(j<0||i+next[i-a]>=p){            if(j<0){                p=i;                j=0;            }            while(p<l1&&s[p]==t[j]){                p++;                j++;            }            extend[i]=j;            a=i;        }else extend[i]=next[i-a];    }}int main(){    memset(next,0,sizeof(next));    scanf("%s%s",s,t);    l1=strlen(s);    l2=strlen(t);    getnext();    getex();    for(int i=0;i<l2;i++){        printf("%d ",next[i]);    }    printf("\n");    for(int i=0;i<l1;i++){        printf("%d ",extend[i]);    }    return 0;}

原创粉丝点击