扩展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+10
void 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;
    }
}
原文地址:https://www.cnblogs.com/ainixu1314/p/4147129.html