70pts求调
查看原帖
70pts求调
742071
ShuAkn楼主2024/5/18 21:17

rt,WA on #13,#14

#include<bits/stdc++.h>
using namespace std;

vector<int> Next,ans;
string text,pattern; 

void nextLoad(string pattern){
	int prefixLen=0;
	Next.push_back(0);
	for(int i=1;i<pattern.size();i++){
		if(pattern[i]==pattern[prefixLen]){
			prefixLen++;
			Next.push_back(prefixLen);
		}
		else if(prefixLen==0){
			prefixLen=0;
			Next.push_back(prefixLen);
		}
		else{
			prefixLen=Next[prefixLen-1];
			i--;
		}
	}
	return;
}
void kmp(string text,string pattern){
	int n=0,i=0;
	bool check=true;
	nextLoad(pattern);
	while(i<text.size()){
		if(text[i]==pattern[n]){
			if(n>=pattern.size()-1){
				ans.push_back(i-n+1);
				n=Next[n];
				i++;
			}
			else{
				n++;
				i++;
			}
		}
		else{
			n=Next[max(n-1,0)];
			if(check&&n==0){
				check=false;
			}
			else if(text[i]==pattern[n]){
				n++;
				i++;
				continue;
			}
			else if(check==false){
				i++;
				continue;
			}
		}
	}
	return;
}
int main(){
	cin>>text>>pattern;
	kmp(text,pattern);
	for(int i=0;i<ans.size();i++){
		cout<<ans[i]<<endl;
	}
	for(int i=0;i<Next.size();i++){
		cout<<Next[i]<<" ";
	}
	cout<<endl;
	return 0;
}
2024/5/18 21:17
加载中...