记录编号 159765 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 GravatarDijkstra 是否通过 通过
代码语言 C++ 运行时间 0.215 s
提交时间 2015-04-22 17:16:26 内存使用 8.90 MiB
显示代码纯文本
#include<fstream>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
#include<cstdio>
#define MAXN 1000001
using namespace std;
ifstream fin("censor.in");
ofstream fout("censor.out");
struct trie
{
	int flag;
	trie* s[26];
	trie* fail;
	trie()
	{
		memset(s,0,sizeof(s));
		fail=NULL;
		flag=0;
	}
};
trie* pos[MAXN];
string A;
char ch[MAXN];
int len[MAXN],M;
trie *root;
void MAKE_TRIE()
{
	root=new trie;
	string st;
	fin>>A;
	fin>>M;
	for(int i=1;i<=M;i++)
	{
		fin>>st;
		len[i]=st.length();
		trie *now=root;
		for(int j=0;j<len[i];j++)
		{
			if(now->s[st[j]-'a']==NULL) 
				now->s[st[j]-'a']=new trie;
			now=now->s[st[j]-'a'];
		}
		now->flag=i;
	}
}
trie* find(trie *x,int y)
{
	while(1)
	{
		if(x->s[y]!=NULL) return x->s[y];
		if(x==root) return root;
		x=x->fail;
	}
	return root;
}
void MAKE_FAIL()
{
	queue<trie*>q;
	q.push(root);
	root->fail=root;
	while(!q.empty())
	{
		trie *cur=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(cur->s[i]!=NULL)
			{
                if(cur==root) cur->s[i]->fail=root;
                else cur->s[i]->fail=find(cur->fail,i);
                q.push(cur->s[i]);
			}
			else cur->s[i]=find(cur,i);
		}
	}
}
void SCAN_PASG()
{
	int tot=0;
	trie* now=root;
	pos[0]=root;
	int l=A.length();
	for(int i=0;i<l;i++)
	{
		now=now->s[A[i]-'a'];
		tot++;
		pos[tot]=now;
		ch[tot]=A[i];
		if(now->flag!=0)
		{
			tot-=len[now->flag];
			now=pos[tot];
		}
	}
	for(int i=1;i<=tot;i++) fout<<ch[i];
	fout<<endl;
}
int main()
{
	MAKE_TRIE();
	MAKE_FAIL();
	SCAN_PASG();
	return 0;
}