记录编号 160969 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.226 s
提交时间 2015-04-30 10:44:17 内存使用 6.99 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
 
#define N 1000010
#define M 26
 
using namespace std;
 
void file(){
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
}
 
struct node{
	node *ch[M],*fail;
	int v,len;
}*root,*next[N];
 
void addin(char *c){
	node* tmp=root;
	int len=strlen(c);
	while(*c!='\0'){
		int t=*c-'a';
		if(tmp->ch[t]==NULL) tmp->ch[t]=new node();
		tmp=tmp->ch[t];
		c++;
	}
	tmp->v=max(len,tmp->v);
}
 
queue<node*> q;
 
void getfail(){
	q.push(root);
	while(!q.empty()){
		node* tmp=q.front(); q.pop();
		for(int t=0;t<M;t++){
			if(tmp->ch[t]!=NULL){
				if(tmp==root) tmp->ch[t]->fail=root;
				else tmp->ch[t]->fail=tmp->fail->ch[t];
				q.push(tmp->ch[t]);
			}
			else{
				if(tmp==root) tmp->ch[t]=root;
				else tmp->ch[t]=tmp->fail->ch[t];
			}
			node* p=tmp->ch[t];
			if(tmp->ch[t]==root) p->len=p->v;
			else p->len=max(p->v,p->fail->len);
		}
	}
}
 
char ans[N],S[N];
int tot;
 
void ask(char *c){
	node* tmp=root;
	tot=0;
	next[0]=root;
	while(*c!='\0'){
		int t=*c-'a',len=0;
		ans[++tot]=*c;
		tmp=tmp->ch[t];
		next[tot]=tmp;
		tot-=tmp->len;
		tmp=next[tot];
		c++;
	}
	for(int i=1;i<=tot;i++) putchar(ans[i]);
	putchar('\n');
}
 
int n;
char str[N];
 
int main(){
	file();
	root=new node();
	scanf("%s",S);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",str);
		addin(str);
	}
	getfail();
	ask(S);
	fclose(stdin);
	fclose(stdout);
	return 0;
}