比赛 20150420 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 cstdio 运行时间 0.225 s
代码语言 C++ 内存使用 6.51 MiB
提交时间 2015-04-20 09:05:30
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define Nil NULL
const int SIZES=1000010,SIZEN=100010;
class Node{
public:
	int flag;//是否敏感词
	Node* ch[26];
	Node* fail;
	Node(){
		flag=-1;
		memset(ch,0,sizeof(ch));
		fail=Nil;
	}
};
Node *root;
Node* step(Node *x,int k){
	while(true){
		if(x->ch[k]!=Nil) return x->ch[k];
		if(x==root) return root;
		x=x->fail;
	}
}
queue<Node*> Q;
void make_automaton(void){
	root->fail=root;
	Q.push(root);
	while(!Q.empty()){
		Node *x=Q.front();Q.pop();
		for(int i=0;i<26;i++){
			if(x->ch[i]!=Nil){
				if(x==root) x->ch[i]->fail=root;
				else x->ch[i]->fail=step(x->fail,i);
				Q.push(x->ch[i]);
			}
			else x->ch[i]=step(x,i);
		}
	}
}
char S[SIZES];
int M;
int len[SIZEN]={0};
char str[SIZEN];
Node* pos[SIZES];
char ans[SIZES];
int tot=0;
void work(void){
	int L=strlen(S+1);
	Node *now=root;
	pos[0]=root;
	for(int i=1;i<=L;i++){
		now=now->ch[S[i]-'a'];
		tot++;
		pos[tot]=now;
		ans[tot]=S[i];
		if(now->flag!=-1){
			int k=now->flag;
			tot-=len[k];
			now=pos[tot];
		}
	}
	for(int i=1;i<=tot;i++) printf("%c",ans[i]);
	printf("\n");
}
void init(void){
	root=new Node;
	scanf("%s",S+1);
	scanf("%d",&M);
	for(int i=1;i<=M;i++){
		scanf("%s",str);
		len[i]=strlen(str);
		Node *now=root;
		for(int j=0;j<len[i];j++){
			int k=str[j]-'a';
			if(now->ch[k]==Nil) now->ch[k]=new Node;
			now=now->ch[k];
		}
		now->flag=i;
	}
}
int main(){
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	init();
	make_automaton();
	work();
	return 0;
}