30分求调
查看原帖
30分求调
794148
cyx20091026楼主2024/12/4 21:20
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int l1,l2;
int nxt[10000001];
void getNext(){
	int i=0;
	for(int j=1;j<l1;j++){
		while(s2[i]!=s2[j]&&i!=0) i=nxt[i];
		if(s2[i]==s2[j]) i++;
		nxt[j]=i;
	}
}
void kmp(){
	int i=0;
	for(int j=0;j<l1;j++){
		while(s1[j]!=s2[i]&&i!=0) i=nxt[i-1];
		if(s1[j]==s2[i]) i++;
		if(i==l2){
			cout<<j-l2+2<<endl;
			i=nxt[i-1];			
		}
	}
}
int main(){
	cin>>s1>>s2;
	l1=s1.size();
	l2=s2.size();
	getNext();
	kmp();
	for(int i=0;i<l2;i++) cout<<nxt[i]<<" ";
	return 0;
} 

附:测试结果

测试结果

2024/12/4 21:20
加载中...