记录编号 159337 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.641 s
提交时间 2015-04-20 20:39:59 内存使用 2.29 MiB
显示代码纯文本
#include<cstdio>
#include<deque>
#include<string>
#include<iostream>
using namespace std;
string a,b[100001];
char ans[1000001];
int n,len[100000]={0};
class miku
{
public:
	int link[27];
	int fail;
	int flag;
	miku()
	{
		for(int i=0;i<26;i++)
			link[i]=-1;
		fail=-1;
		flag=-1;
	}
};
deque<miku> q;
int tire(string c,int i)
{
	int root=0,le=c.length();
	for(int j=0;j<le;j++)
	{
		int t=c[j]-'a';
		if(q[root].link[t]==-1)
		{
			miku x;
			q[root].link[t]=q.size();
			q.push_back(x);
		}
		root=q[root].link[t];
	}
	q[root].flag=i;
	return 0;
}
int step(int x,int y)
{
	while(true)
	{
		if(q[x].link[y]!=-1) return q[x].link[y];
		else if(x==0) return 0;
		x=q[x].fail;
	}
}
int makefail()
{
	int root=0;
	deque<int> Q;
	q[0].fail=0;
	Q.push_back(0);
	while(!Q.empty())
	{
		int x=Q.front();
		Q.pop_front();
		for(int i=0;i<26;i++)
		{
			if(q[x].link[i]!=-1)
			{
				if(x==0) q[q[x].link[i]].fail=0;
				else
					q[q[x].link[i]].fail=step(q[x].fail,i);
				Q.push_back(q[x].link[i]);
			}
			else q[x].link[i]=step(x,i);
		}
	}
	return 0;
}
int main()
{
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	cin>>a;
	miku x;
	q.push_back(x);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
		len[i]=b[i].length();
		tire(b[i],i);
	}
	makefail();
	int le=a.length(),root=0,pos[100000]={0},tot=0;
	for(int i=0;i<le;i++)
	{
		int t=a[i]-'a';
		if(q[root].link[t]!=-1)
			root=q[root].link[t];
		else
		   root=step(q[root].fail,t);
		tot++;
		pos[tot]=root;
		ans[tot]=a[i];
		if(q[root].flag!=-1)
		{
			tot-=len[q[root].flag];
			root=pos[tot];
		}
	}
	for(int i=1;i<=tot;i++)
		cout<<ans[i];
	/*for(int i=0;i<q.size();i++)
	{
		cout<<i<<" "<<q[i].flag<<" "<<q[i].fail<<endl;
		for(int j=0;j<26;j++)
		cout<<q[i].link[j]<<" ";
		cout<<endl;
	}*/
	return 0;
}