KMP模板

题目

KMP模板

时间复杂度:\(O(n+m)\)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
string p,s;
int nxt[N];
void kmp(){
	for(int i=2,j=0;i<=p.size()-1;i++){
		while(j&&p[i]!=p[j+1]) j=nxt[j];//无法匹配就跳
		if(p[i]==p[j+1]) j++;
		nxt[i]=j;
	}
	for(int i=1,j=0;i<=s.size()-1;i++){
		while(j&&(s[i]!=p[j+1]||j==p.size()-1)) j=nxt[j];
		if(s[i]==p[j+1]) j++;
		if(j==p.size()-1){
			cout<<i-p.size()+2<<'\n';
		}
	}
}
int main(){
	cin>>s>>p;
	s=' '+s;p=' '+p;
	kmp();
	for(int i=1;i<=p.size()-1;i++){
		cout<<nxt[i]<<' ';
	}
	return 0;
}

关于一些点

呵呵,只有我能看

posted @ 2026-10-28 19:00  decentz  阅读(6)  评论(0)    收藏  举报