样例过,0pts,求调。
查看原帖
样例过,0pts,求调。
538821
m1kusama楼主2023/8/10 10:00
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
string s1,s2;
int len1,len2;
int nxt[N];
void _next(){
	nxt[1]=0;
	for(int now=2;now<=len2;now++){
		if(s2[now]==s2[nxt[now-1]+1]){
			nxt[now]=nxt[now-1]+1;
		}else{
			if(nxt[nxt[now-1]]!=0){
				if(s2[nxt[now-1]+1]==s2[now]){
					nxt[now]=nxt[nxt[now-1]]+1;
				}else{
					nxt[now]=0;
				}
			}
		}
	}
}

void kmp(){
	int i=1,j=1;
	while(i<=len1){
		
		if(s1[i]==s2[j]){
	     //	cout<<"!!!";cout<<i<<" "<<j<<endl;
			i++,j++;
			
		}
		else if(j>1){
			j=nxt[j-1];
		}else{
			i++;
		}
		if(j>len2){
			cout<<i-len2<<endl;
			j=nxt[j-1];
			i--;
		}
		
	}
}
int main(){
	cin>>s1>>s2;
	len1=s1.length();
	len2=s2.length();
	for(int i=len1;i>=1;i--) s1[i]=s1[i-1];
	for(int i=len2;i>=1;i--) s2[i]=s2[i-1];
	_next();
	kmp();
	for(int i=1;i<=len2;i++) cout<<nxt[i]<<" ";
	return 0;
}
2023/8/10 10:00
加载中...