【模板】一对一匹配,KMP算法
from:https://blog.csdn.net/starstar1992/article/details/54913261
模板:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #define MAXS 1000005 #define MAXT 1000005 #define ms(n,x) memset(n,x,sizeof(n)) using namespace std; char S[MAXS],T[MAXT]; int next[MAXT]; int Slen,Tlen; int ans[MAXS],cur=0; void Next() { ms(next,-1); int k=-1; for(int i=1;i<Tlen;i++) { while(k>-1&&T[k+1]!=T[i]) k=next[k]; if(T[k+1]==T[i]) k=k+1; next[i]=k; } } void KMP() { Next(); int k=-1; for(int i=0;i<Slen;i++) { while(k>-1&&T[k+1]!=S[i]) k=next[k]; if(T[k+1]==S[i]) k=k+1; if(k==Tlen-1) { ans[cur++]=i-Tlen+1; k=-1; i=i-Tlen+1; } } } int main() { scanf("%s%s",S,T); Slen=strlen(S); Tlen=strlen(T); KMP(); if(cur)//S在T中出现的位置 { for(int i=0;i<cur;i++) printf("%d\n",ans[i]+1); } for(int i=0;i<Tlen-1;i++)//输出子串的前缀数组next printf("%d ",next[i]+1); printf("%d\n",next[Tlen-1]+1); return 0; } /* bacbababadababacambabacaddababacasdsd ababaca */