本来打算打一个暴力 (O(n2)) ,但是拿到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,知道找不下去了。
回复请 @ ,要睡觉了