傳送門
題意:給你匹配串,然後有很多模式串,要刪除匹配串中所有的模式串(刪除的過程中,可能會出現新的模式串
解:匹配的過程中,我們可以用個棧去記錄,一旦匹配,減去長度,就可以回去到刪除後最後一個字符的節點處
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int N=1e6+5;
//il int Add(int &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(int &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
struct node{
int son[26],fail,flag;
}tr[N];
queue<int> q;
char stk[N],str[N],ss[N];
int stpos[N],n;
int cnt=1,top=0;
il void add(char *s){
int root=1,len=strlen(s),id;
for(int i=0;i<len;++i){
id=s[i]-'a';
if(!tr[root].son[id]){
tr[root].son[id]=++cnt;
}
root=tr[root].son[id];
}
tr[root].flag=len;
}
il void getFail(){
for(int i=0;i<26;++i) tr[0].son[i]=1;
q.push(1);
int u,ufail,v;
while(!q.empty()){
u=q.front(),ufail=tr[u].fail,q.pop();
for(int i=0;i<26;++i){
v=tr[u].son[i];
if(!v){
tr[u].son[i]=tr[ufail].son[i];
continue;
}
tr[v].fail=tr[ufail].son[i];
q.push(v);
}
}
}
il void match(char *s){
int len=strlen(s),root=1;
for(int i=0;i<len;++i){
stk[++top]=s[i];
stpos[top]=root;//上一個節點
root=tr[root].son[s[i]-'a'];
if(tr[root].flag){
top-=tr[root].flag,root=stpos[top+1];
}
}
}
int main(){
// std::ios::sync_with_stdio(0);cin.tie(0);
scanf("%s",str);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%s",ss);
add(ss);
}
getFail();
match(str);
for(int i=1;i<=top;++i){
printf("%c",stk[i]);
}
return 0;
}