《关于我用暴力kmp只T了一个点这件事》
查看原帖
《关于我用暴力kmp只T了一个点这件事》
382650
神蝶涵光楼主2021/2/22 15:39

时间复杂度是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;
}
2021/2/22 15:39
加载中...