这里贴一段模板
#include <bits/stdc++.h>
using namespace std;
#define M 100005
struct KMP{
int n,m,sz;
int ans[M];
int fail[M];
int a[M],s[M];
void Fail(){//a为子串,长度为m,s为母串长度为n
fail[1]=0;
fail[2]=1;
for(int i=2,j;i<=m;i++){
j=fail[i];
while(j&&a[i]!=a[j])j=fail[j];
fail[i+1]=j+1;
}
}
void Match(){
for(int i=1,j=1;i<=n;i++){
while(j&&s[i]!=a[j])j=fail[j];
j++;
if(j==m+1){
ans[++sz]=i-m+1;
j=fail[j];
}
}
}
}KMP;