看着这一篇博客学会的,感谢大佬详细的教程: https://www.luogu.org/blog/lc-2018-Canton/solution-p5410
但是代码学的kuangbin巨巨的板子

代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 4;
char s[maxn];
int Next[maxn],extend[maxn];
void pre_ex_kmp(char x[],int m)
{
	Next[0]=m;
	int j=0,k=1;
	while(j+1<m&&x[j]==x[j+1]) j++;
	Next[1]=j;
	for(int i=2;i<m;i++) {
		int p=Next[k]+k-1,L=Next[i-k];
		if(i+L<p+1) Next[i]=L;
		else {
			j=max(0,p-i+1);
			while(i+j<m&&x[i+j]==x[j]) j++;
			Next[i]=j;
			k=i;
		} 
	}
}
void ex_kmp(char x[],int m,char y[],int n)
{
	pre_ex_kmp(x,m);
	int j=0;
	while(j<n&&j<m&&x[j]==y[j]) j++;
	extend[0]=j;
	int k=0;
	for(int i=1;i<n;i++) {
		int p=extend[k]+k-1,L=Next[i-k];
		if(i+L<p+1) extend[i]=L;
		else {
			j=max(0,p-i+1);
			while(i+j<n&&j<m&&y[i+j]==x[j]) j++;
			extend[i]=j;
			k=i;
		}
	}
}
int main()
{
	char s[maxn],t[maxn];
	scanf("%s%s",s,t);
	int m=strlen(t),n=strlen(s);
	ex_kmp(t,m,s,n);
	for(int i=0;i<m;i++) printf("%d ",Next[i]);
	printf("\n");
	for(int i=0;i<n;i++) printf("%d ",extend[i]);
	return 0;
}