【模板】KMP字符串匹配

Description

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置,并输出next数组

solution

kmp每一次打出来的都千奇百怪,以后就以今天打的为准了:

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=1000005;
int nxt[N],n,m;
char a[N],s[N];
void work()
{
	scanf("%s",a+1);
	scanf("%s",s+1);
	int p,n=strlen(a+1),m=strlen(s+1);
	for(int i=2;i<=m;i++){
		p=nxt[i-1];
		while(p && s[p+1]!=s[i])p=nxt[p];
		if(s[p+1]==s[i])nxt[i]=p+1;
	}
	p=0;
	for(int i=1;i<=n;i++){
		if(s[p+1]==a[i])p++;
		else{
			while(p && s[p+1]!=a[i])p=nxt[p];
			if(s[p+1]==a[i])p++;
		}
		if(p==m)printf("%d
",i-m+1);
	}
	for(int i=1;i<=m;i++)printf("%d ",nxt[i]);
}

int main()
{
	work();
	return 0;
}

原文地址:https://www.cnblogs.com/Yuzao/p/7799690.html