kmp板子求调QAQ(样例过了)
  • 板块题目总版
  • 楼主only_once
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/15 19:30
  • 上次更新2024/10/15 21:10:21
查看原帖
kmp板子求调QAQ(样例过了)
1328928
only_once楼主2024/10/15 19:30
#include<iostream>
#define int long long
using namespace std;
const int N=1e6+5;
int len1,len2,nxt[N];
string s1,s2;
void build(){
	nxt[1]=0;
	for(int i=2;i<=len2;i++){
		int j=i-1;
		if(s2[nxt[j]+1]==s2[i]) nxt[i]=nxt[i-1]+1;
		else{
			while(1){
				j=nxt[j];	
				if(s2[nxt[j]+1]==s2[i]) nxt[i]=nxt[j]+1;
				if(nxt[j]==0) break;
			}
		}
	}
}
void ans(){
	int i=1,j=1;
	while(i<=len1){
		//cout<<i<<' '<<j<<endl;
		if(s1[i]==s2[j]){
			if(j==len2){
				cout<<i-len2+1<<'\n';
				i=i-len2+2;
				j=1;
				continue;
			}
			i++;
			j++;
		}
		else if(j==1){
			i++;
		}
		else{
			while(1){
				if(j==1) break;
				j=nxt[j]+1;
				if(s1[i]==s2[j]) break;
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>s1>>s2;
	len1=s1.size();
	len2=s2.size();
	s1='0'+s1;
	s2='0'+s2;
	build();
	ans();
	for(int i=1;i<=len2;i++) cout<<nxt[i]<<' ';
	return 0;
} 
2024/10/15 19:30
加载中...