时间复杂度是O(s1.size()*玄学次)
只T了一个
开O2就能过
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int next[1000001];
void get_next()
{
int t1=0,t2=-1;
next[0]=-1;
while(t1<s2.size())
{
if(t2==-1||s2[t1]==s2[t2])
next[++t1]=++t2;
else
t2=next[t2];
}
}
bool kmp()
{
int t1=0,t2=0;
while(t1<s1.size())
{
if(t2==-1||s1[t1]==s2[t2])
{
t1++;
t2++;
}
else
t2=next[t2];
if(t2==s2.size())
{
s1.erase(t1-s2.size(),s2.size());
return true;
}
}
return false;
}
int main()
{
cin>>s1>>s2;
get_next();
while(kmp());
cout<<s1;
return 0;
}