F03【模板】KMP 算法

视频链接:F03【模板】KMP 算法——信息学竞赛算法_哔哩哔哩_bilibili

 

Luogu P3375【模板】KMP字符串匹配

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N=1000010;
int m,n;
char S[N],P[N];
int nxt[N];

int main(){
  cin>>S+1>>P+1;
  m=strlen(S+1),n=strlen(P+1);
  
  nxt[1]=0;
  for(int i=2,j=0;i<=n;i++){
    while(j && P[i]!=P[j+1]) j=nxt[j];
    if(P[i]==P[j+1]) j++;
    nxt[i]=j;
  }
  
  for(int i=1,j=0;i<=m;i++){
    while(j && S[i]!=P[j+1]) j=nxt[j];
    if(S[i]==P[j+1]) j++;
    if(j==n) printf("%d\n",i-n+1);
  }
  
  for(int i=1;i<=n;i++)printf("%d ",nxt[i]);
  return 0;
}

 

posted @ 2022-04-13 19:30  董晓  阅读(2835)  评论(0编辑  收藏  举报