#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> next;
int GetOfIndex(string& s1,string& s2,int start)
{
int cur1=start;
int cur2=0;
while(cur1<s1.size()&&cur2<s2.size())
{
if(s1[cur1]==s2[cur2]){
cur1++;cur2++;
}
else if(next[cur2]==-1)cur1++;
else cur2=next[cur2];
}
return cur2==s2.size()?cur1-cur2:-1;
}
void KMP(string& s1,string& s2)
{
next.resize(s2.size());
next[0]=-1;next[1]=0;
int cn=0;int cur=2;
while(cur<s2.size())
{
if(s2[cur-1]==s2[cn])next[cur++]=++cn;
else if(cn>0)cn=next[cn];
else next[cur++]=0;
}
int sign=0;
int start=0;
while(1)
{
sign=GetOfIndex(s1,s2,start);
if(sign==-1)break;
s1.erase(sign,s2.size());
start=sign-s2.size()>=0?sign-s2.size():0;
}
}
int main( )
{
string str1;
string str2;
cin>>str1>>str2;
KMP(str1,str2);
cout<<str1;
}
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> next;
int GetOfIndex(string& s1,string& s2,int start)
{
int cur1=start;
int cur2=0;
while(cur1<s1.size()&&cur2<s2.size())
{
if(s1[cur1]==s2[cur2]){
cur1++;cur2++;
}
else if(next[cur2]==-1)cur1++;
else cur2=next[cur2];
}
return cur2==s2.size()?cur1-cur2:-1;
}
void KMP(string& s1,string& s2)
{
next.resize(s2.size());
next[0]=-1;next[1]=0;
int cn=0;int cur=2;
while(cur<s2.size())
{
if(s2[cur-1]==s2[cn])next[cur++]=++cn;
else if(cn>0)cn=next[cn];
else next[cur++]=0;
}
int sign=0;
int start=0;
while(1)
{
sign=GetOfIndex(s1,s2,start);
if(sign==-1)break;
s1.erase(sign,s2.size());
start=sign-s2.size()-1;
if(start<0)start=0;
}
}
int main( )
{
string str1;
string str2;
cin>>str1>>str2;
KMP(str1,str2);
cout<<str1;
}
89行的地方 第一个用的三目运算WA,第二个用if就AC了?????要不是我瞎改了下,还真找不到这个地方的错误??