比赛 20150420 评测结果 AWAWWAWWAWWAWAA
题目名称 审查 最终得分 46
用户昵称 清羽 运行时间 0.338 s
代码语言 C++ 内存使用 17.21 MiB
提交时间 2015-04-20 11:04:32
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=1e5+100;
const int maxl=1e6+100;
const int sigma_size=26;

bool vis[maxn];
int n,pos[maxl];
char buf[40],s[maxl],s2[maxl];
int tot=1,f[maxn],last[maxn],val[maxn],ch[maxn][sigma_size];

template<class T> inline bool getd(T& x)
{
	int ch=getchar();
	bool neg=false;
	while(ch!=EOF && ch!='-' && !isdigit(ch)) ch=getchar();
	if(ch==EOF) return false;
	if(ch=='-'){
		ch=getchar();
		neg=true;
	}
	x=ch-'0';
	while(isdigit(ch=getchar())) x=x*10+ch-'0';
	if(neg) x=-x;
	return true;
}

template<class M> inline void putd(M x)
{
	int p=0;
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x==0) buf[p++]=0;
	while(x){
		buf[p++]=x%10;
		x/=10;
	}
	for(int i=p-1;i>=0;i--) putchar(buf[i]+'0');
}

int idx(char c)
{
	return c-'a';	
}

void insert(char* s)
{
	int l=strlen(s),u=0;
	for(int i=0;i<l;i++){
		int c=idx(s[i]);
		if(!ch[u][c]) ch[u][c]=tot++;
//		printf("%d %c %d\n",u,c+'a',ch[u][c]);
		u=ch[u][c];
	}
	val[u]=l;
}

void Get_Fail()
{
	queue<int> q;
	for(int i=0;i<sigma_size;i++){
		int u=ch[0][i];
		if(u){ q.push(u);f[u]=0;last[u]=0; }
	}
	
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(int i=0;i<sigma_size;i++){
			int k=ch[u][i];
			if(!k) continue;
			q.push(k);
			int v=f[u];
			while(!ch[v][i] && v) v=f[v];
			f[k]=ch[v][i];
			last[k]=val[f[k]]?f[k]:last[f[k]];
		}
	}
}

void init()
{
	memset(ch,0,sizeof(ch));
	memset(val,0,sizeof(val));
	memset(vis,false,sizeof(vis));
	
	scanf("%s",s);
	getd(n);
	for(int i=0;i<n;i++){
		scanf("%s",s2);
		insert(s2);
	}
	Get_Fail();
}

void work()
{
	int u=0,l=strlen(s);
	//pos[i]表示在模板串匹配完第i位ac自动机中的位置 
	for(int i=0;i<l;i++){
		int c=idx(s[i]);
		while(u && !ch[u][c]) u=f[u];
		u=ch[u][c];
		pos[i]=u;
//		printf("pos[%d]=%d\n",i,pos[i]);		
		if(val[u]){
			int num=val[u],j=i;
			while(num){
				while(vis[j]) j--;
				vis[j]=true;
				num--;
			}
			u=pos[i-val[u]];
		}
		if(last[u]){
			u=last[u];
			int num=val[u],j=i;
			while(num){
				while(vis[j]) j--;
				vis[j]=true;
				num--;
			}
			u=pos[i-val[u]];
		}
	}
	for(int i=0;i<l;i++) if(!vis[i]) putchar(s[i]);
	putchar('\n');
}

int main()
{
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	init();
	work();
	fclose(stdin);
	fclose(stdout);
	return 0;
}