逆天byd红名蒟蒻不会kmp,大红大黑大绿求条(马蜂良好)
查看原帖
逆天byd红名蒟蒻不会kmp,大红大黑大绿求条(马蜂良好)
822439
lhz2022楼主2024/10/18 18:47
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() puts("I WILL AK")
#define N 1000007
string a,b;
int n,m;
int nxt[N];
void init(){
	int j=0;
	for(int i=2;i<=m;++i){
		while(j>0&&b[j]!=b[j+1]){
			j=b[j];
		}
		if(b[i]==b[j+1]){
			j++;
		}
		nxt[i]=j;
	}
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>a>>b;
	n=a.size(),m=b.size();
	a=" "+a,b=" "+b;
	init();
	int j=0;
	for(int i=1;i<=n;++i){
		while(j>0&&a[i]!=b[j+1]){
			j=nxt[j];
		}
		if(a[i]==b[j+1]) j++;
		if(j==m){
			cout<<i-m+1<<'\n';//配对成功
			j=nxt[j];
		}
	}
	for(int i=1;i<=m;++i){
		cout<<nxt[i]<<' ';
	}
	return 0;
}
2024/10/18 18:47
加载中...