洛谷 P3375 【模板】KMP字符串匹配

KMP 模板

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000005
using namespace std;
char s1[MAXN],s2[MAXN];
int nxt[MAXN];
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf(" %s %s ",s1,s2);
    nxt[0]=-1;
    int j=-1,i=0;
    int n=strlen(s1),m=strlen(s2);
    while(i<m){
        while(j!=-1&&s2[i]!=s2[j])j=nxt[j];
        nxt[++i]=++j;
    }
    i=j=0;
    while(i<n){
        while(j!=-1&&s1[i]!=s2[j])j=nxt[j];
        i++;j++;
        if(j>=m){
            printf("%d\n",i-m+1);
            j=nxt[j];
        }
    }
    for(int i=1;i<=m;i++)printf("%d ",nxt[i]);
    return 0;
}

在这里插入图片描述

posted @ 2020-04-15 21:48  winechord  阅读(58)  评论(0编辑  收藏  举报