#include<bits/stdc++.h>
using namespace std;
const int V=100009;
struct Node{
int son[26];
int fail;
int end;
} trie[V];
#define son(u,i) trie[u].son[i]
#define fail(u) trie[u].fail
#define end(u) trie[u].end
int nTrie,hst[V*26];
char txt[V],ptn[V],ans[V],len[V*26];
void input(){
scanf("%s",txt+1);
}
void buildACA(){
queue<int> q;
for(int i=0;i<26;i++){
if(son(0,i)) q.push(son(0,i));
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<26;i++){
int &v=son(u,i);
int w=son(fail(u),i);
if(v){
q.push(v);
fail(v)=w;
}
else{
v=w;
}
}
}
}
void addTrie(char* str){
int lenStr=strlen(str+1);
int u=0;
for(int i=1;i<=lenStr;i++){
int &v=son(u,str[i]-'a');
if(!v) v=++nTrie;
u=v;
}
len[u]=lenStr;
end(u)=1;
}
void solve(){
int lenT=strlen(txt+1);
int nPtn;
cin>>nPtn;
for(int i=1;i<=nPtn;i++){
scanf("%s",ptn+1);
addTrie(ptn);
}
buildACA();
int lenAns=0;
int u=0;
for(int i=1;i<=lenT;i++){
ans[++lenAns]=txt[i];
u=son(u,txt[i]-'a');
hst[lenAns]=u;
if(!end(u)) continue;
lenAns-=len[u];
u=hst[lenAns];
}
for(int i=1;i<=lenAns;i++) cout<<ans[i];
cout<<endl;
}
int main(){
input();
solve();
return 0;
}
AC了四个点
思路是AC自动机