屏蔽词删除
题目
解析
先拿屏蔽词建AC自动机,然后拿S去跑AC自动机,同时维护一个栈,每压入一个字符,check一下有没有屏蔽,有的话就弹出
∣
该
屏
蔽
词
∣
|该屏蔽词|
∣该屏蔽词∣个即可
最后栈中剩下的字符即为答案
code:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[100010],q[100010],st[100010];
int n,t,r,fa[100010];
struct AC_easy
{
int tot=1,q,ch[100010][26],nxt[100010],val[100010],k;
queue<int> b;
inline void insert(char *s)
{
int len=strlen(s),now=1;
for(int i=0;i<len;++i)
{
if(!ch[now][s[i]-'a'])ch[now][s[i]-'a']=++tot;
now=ch[now][s[i]-'a'];
}
val[now]=len;
}
inline void bfs()
{
for(int i=0;i<=25;++i)ch[0][i]=1;
b.push(1);
while(b.size())
{
k=b.front(),b.pop();
for(int i=0;i<=25;++i)
{
if(!ch[k][i])ch[k][i]=ch[nxt[k]][i];
else nxt[ch[k][i]]=ch[nxt[k]][i],b.push(ch[k][i]);
}
}
}
inline void ask(char *s)
{
int len=strlen(s),now=1;
for(int i=0;i<len;++i)
{
now=ch[now][s[i]-'a'],st[++r]=s[i],fa[r]=now;
if(val[now])r-=val[now],now=fa[r];
}
}
}AC;
int main()
{
cin>>q>>n;
for(int i=1;i<=n;++i)scanf("%s",&s),AC.insert(s);
AC.bfs(),AC.ask(q);
for(int i=1;i<=r;++i)putchar(st[i]);
return 0;
}