求助蜜汁错误
查看原帖
求助蜜汁错误
362762
lzyzs楼主2023/9/8 18:16
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e5+20;
struct edge{
	int vis[26];
	int ok,len,fail;
}tr[N];
string s,t;
int n,id;
void build(int u,int k=0)
{
	cin >> t;
	for(int i=0;i<t.size();i++) 
	{
		if(!tr[k].vis[t[i]-'a']) tr[k].vis[t[i]-'a']=++id;
		tr[tr[k].vis[t[i]-'a']].len=tr[k].len+1;
		k=tr[k].vis[t[i]-'a'];
	}
	tr[k].ok=1;
}
void getfail()
{
	queue<int> q;
	for(int i=0;i<26;i++) if(tr[0].vis[i]) q.push(tr[0].vis[i]);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(tr[x].vis[i])
			{
				tr[tr[x].vis[i]].fail=tr[tr[x].fail].vis[i];
				q.push(tr[x].vis[i]);
			}
			else tr[x].vis[i]=tr[tr[x].fail].vis[i];
		}
	}
}
int a[N];
void query(int i,int k)
{
//	cout << i << ' ' << k << ' ' << endl;
////	s.size() << ' ' << k << endl;
//	cout << "OK" << endl;
//	if(i==17403) cout << s.size() << endl;
//	cout << "OK" << endl;
	a[i]=k;
	if(i>=s.size()) return;
	if(tr[k].ok)
	{
//		cout << s << endl << tr[k].len << endl;
		if(i-tr[k].len<0) exit(433);
//		cout << i-tr[k].len << ' ' << tr[k].len << endl;
		s.erase(i-tr[k].len,tr[k].len);
//		cout << i-tr[k].len << endl;
//		cout << s.size() << endl;
//		cout << s << ' ' << i-tr[k].len-1 << ' ' << a[i-tr[k].len-1] << endl;
		if(i-tr[k].len-1>=0) query(i-tr[k].len-1,a[i-tr[k].len-1]);
		else query(0,0);
	}
	else query(i+1,tr[k].vis[s[i]-'a']);
}
int main()
{
//	freopen("P3121_4.in","r",stdin);
//	freopen("P3121_4.out","w",stdout);
	cin >> s >> n;
//	cout << s.size() << endl;
	for(int i=1;i<=n;i++) build(i);
//	cout << "OK" << endl;
	getfail();
//	cout << "OK" << endl;
	query(0,0);
	cout << s << endl;
	return 0;
}

提交记录

2023/9/8 18:16
加载中...