比赛 |
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;
}