题目大意:给定串A和一个串的集合B,要求将A中删掉所有的B后输出
题解:和3942一样,把kmp换成AC自动机
我的收获:……
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define idx T[i]-'a'
const int N=100010;
int n,top;
int st[N],bak[N];
char S[N],T[N];
struct AC_DFA{
int tot,c[N][26],dep[N],fail[N],q[N],l,r;
void insert(){
int x=0,len=strlen(T);
for(int i=0;i<len;i++){
if(!c[x][idx]) c[x][idx]=++tot;
x=c[x][idx];
}
dep[x]=len;
}
void getfail(){
l=0,q[r=1]=0,fail[0]=-1;
while(l!=r){
int x=q[++l];
for(int i=0;i<26;i++)
if(c[x][i]) q[++r]=c[x][i],fail[c[x][i]]=!x?0:c[fail[x]][i];
else c[x][i]=!x?0:c[fail[x]][i];
}
}
}AC;
void work()
{
int pos=0;
for(int i=0;S[i];i++){
st[++top]=S[i];
pos=AC.c[pos][S[i]-'a'];bak[top]=pos;
if(AC.dep[pos]) top-=AC.dep[pos],pos=bak[top];
}
for(int i=1;i<=top;i++) putchar(st[i]);
putchar('\n');
}
void init()
{
scanf("%s%d",S,&n);
for(int i=1;i<=n;i++) scanf("%s",T),AC.insert();
AC.getfail();
}
int main()
{
init();
work();
return 0;
}