首页 > 代码库 > 扩展kmp模板

扩展kmp模板

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<set>#include<vector>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<stdlib.h>#include<time.h>using namespace std;#define mmax 100000+10void extendkmp(char *a,char *b,int m,int n,int *next,int *ret){    int i,j,k;    memset(next,0,sizeof(next));    for(j=0;1+j<m&&a[j]==a[1+j];j++); next[1]=j;    k=1;    for(i=2;i<m;i++){        int len=k+next[k],l=next[i-k];        if(l<len-i){            next[i]=l;        }        else{            for(j=max(0,len-i);i+j<m&&a[j]==a[i+j];j++); next[i]=j;            k=i;        }    }    for(j=0;j<n&&j<m&&a[j]==b[j];j++); ret[0]=j;    k=0;    for(i=1;i<n;i++){        int len=k+ret[k],l=next[i-k];        if(l<len-i){            next[i]=l;        }        else{            for(j=max(0,len-i);j<m&&i+j<n&&a[j]==b[i+j];j++); ret[i]=j;            k=i;        }    }}int main(){    char p[mmax],q[mmax];    int next[mmax],ret[mmax];    while(cin>>p>>q){        extendkmp(p,q,strlen(p),strlen(q),next,ret);        for(int i=0;i<strlen(q);i++) cout<<ret[i]<<" ";        cout<<endl;    }}

 

扩展kmp模板