扩展kmp模板

我们两清 提交于 2020-01-13 05:41:02
#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;
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!