记录编号 159371 评测结果 AWWWTTWTTTTTWWA
题目名称 审查 最终得分 13
用户昵称 Gravatarggwdwsbs 是否通过 未通过
代码语言 C++ 运行时间 7.047 s
提交时间 2015-04-20 23:32:52 内存使用 103.67 MiB
显示代码纯文本
#include<stdio.h>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e6+10;
struct tire
{
	int ch[26];
	int fail;
	int val;
}tree[maxn];
//vector<tire>tree;
char s1[maxn/10];
char s[maxn];
int vis[maxn];
int leng[maxn];
int pos[maxn];
int n,root=0;
int now,m=0;
int id(char c)
{
	return c-'a';
}
int Erase(int l,int r)
{
	//for(int i=l;i<=r;i++) vis[i]=1;
	while(r>=l)
	{
		while(vis[r])
		{
			l--;
			r--;
		}
		vis[r]=1;
		r--;
	}
}
int build_tire(char *s1,int v)
{
	int l=strlen(s1);
	now=root;
	for(int i=0;i<l;i++) 
	 if(!tree[now].ch[id(s1[i])]) 
	 {
	 	m++;
	 	tree[now].ch[id(s1[i])]=m;
	 	now=m;
		memset(tree[now].ch,0,sizeof(tree[now].ch));
	 	tree[now].fail=tree[now].val=0;
	 }
	 else now=tree[now].ch[id(s1[i])];
	tree[now].val=v; 
}
int build()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s1);
		leng[i]=strlen(s1);
		build_tire(s1,i);
	}
	queue<int>q;
	tree[root].fail=root;
	for(int i=0;i<26;i++)
	 if(tree[root].ch[i])
	 {
	 	 tree[tree[root].ch[i]].fail=root;
	 	 q.push(tree[root].ch[i]);
	 }
	while(q.size()>0)
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++)
		{
			if(!tree[u].ch[i]) tree[u].ch[i]=tree[tree[u].fail].ch[i];
			else
			{
				int v=tree[u].fail;
				while(v&&!tree[v].ch[i]) v=tree[v].fail;
				tree[u].fail=tree[v].ch[i];
		 		q.push(tree[u].ch[i]);
			}
		}
	}
}
int find()
{
	int l=strlen(s);
	int j=0;
	for(int i=0;i<l;i++)
	 {
		//while(j&&!tree[j].ch[id(s[i])]) j=tree[j].fail;
		j=tree[j].ch[id(s[i])];
		if(tree[j].val!=0)
		{
			Erase(i-leng[tree[j].val]+1,i);
			j=pos[i-leng[tree[j].val]];
		}
 	 }
}
int main()
{
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	scanf("%s",s);
	build();
	int l=strlen(s);
	int j=0; 
	for(int i=0;i<l;i++)
	{
		j=tree[j].ch[id(s[i])];
		pos[i]=j;
	}
	find();
	for(int i=0;i<l;i++)
	 if(!vis[i]) printf("%c",s[i]);
}
/*
begintheescapexecutionatthebreakofdawn
2
escape
execution*/