悬棺求条(nxt输出炸了
查看原帖
悬棺求条(nxt输出炸了
1373205
dg114514楼主2024/11/21 16:40

rt,

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int nxt[1919810],N[1919810];
void getnxt(const string& s,int* _nxt){
	memset(_nxt,0,sizeof _nxt);
	_nxt[0]=-1;
	int k=-1;
    for(int i=1;i<s.size();i++){
        while((~k)&&s[i]!=s[k+1])k=_nxt[k];
        if(s[i]==s[k+1])k++;
        _nxt[i]=k;
    }
}
vector<int> kmp(const string& s,const string& t){
	vector<int> pos;
	getnxt(t,nxt);
	int j=0,n=s.size(),m=t.size();
	for(int i=0;i<n;i++){
		while(~j&&t[j+1]!=s[i])j=nxt[j];
		j++;
		if(t[j+1]==s[i])j++;
		else if(j==m-1)pos.emplace_back(i-j+1);
	}
	return pos;
} 
void solve(){
	string a,b;
	cin>>a>>b;
	auto ans=kmp(a,b);
	for(auto &i:ans)cout<<i<<"\n";
  for(int i=1;i<=b.size();i++)cout<<nxt[i]<<" ";
}
int main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); 
	solve(); 
	return 0;
}
2024/11/21 16:40
加载中...