蒟蒻求助
查看原帖
蒟蒻求助
359614
Forever1507楼主2021/9/23 23:15

本来打算打一个暴力 (O(n2))(O(n^2)) ,但是拿到88分并没有T(全是WA),想问一下还有没有救?

#include<bits/stdc++.h>
using namespace std;
int len1,len2,nxt[1000005];
void pre(string s2){
	int i=0,j=-1;
	nxt[0]=-1;
	while(i<len2){
		if(j==-1||s2[i]==s2[j])nxt[++i]=++j;
		else j=nxt[j];
	}
}
int KMP(string &s1,string s2){
	len1=s1.size();
	int cnt=0;
	int i=0,j=0;
	while(i<len1){
		if(j==len2-1&&s1[i]==s2[j]){
			s1.erase(i-j,len2);//直接删掉,不用担心是否跳错了
			i-=len2;//因为思路是只要还有就一直KMP
			len1=s1.size();
			j=-1;//这次没找到下次还会找
			cnt++;
		}
		if(j==-1||s1[i]==s2[j])i++,j++;
		else j=nxt[j];
	}
	return cnt;
}
int main(){
	string s1,s2;
	cin>>s1>>s2;
	len1=s1.size();
	len2=s2.size();
	pre(s2);
	while(KMP(s1,s2));
	cout<<s1;
} 

大致思路:只要还能找到要删的串就一直KMP,知道找不下去了。

回复请 @ ,要睡觉了

2021/9/23 23:15
加载中...