#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e5+20;
struct edge{
int vis[26];
int ok,len,fail;
}tr[N];
string s,t;
int n,id;
void build(int u,int k=0)
{
cin >> t;
for(int i=0;i<t.size();i++)
{
if(!tr[k].vis[t[i]-'a']) tr[k].vis[t[i]-'a']=++id;
tr[tr[k].vis[t[i]-'a']].len=tr[k].len+1;
k=tr[k].vis[t[i]-'a'];
}
tr[k].ok=1;
}
void getfail()
{
queue<int> q;
for(int i=0;i<26;i++) if(tr[0].vis[i]) q.push(tr[0].vis[i]);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(tr[x].vis[i])
{
tr[tr[x].vis[i]].fail=tr[tr[x].fail].vis[i];
q.push(tr[x].vis[i]);
}
else tr[x].vis[i]=tr[tr[x].fail].vis[i];
}
}
}
int a[N];
void query(int i,int k)
{
a[i]=k;
if(i>=s.size()) return;
if(tr[k].ok)
{
if(i-tr[k].len<0) exit(433);
s.erase(i-tr[k].len,tr[k].len);
if(i-tr[k].len-1>=0) query(i-tr[k].len-1,a[i-tr[k].len-1]);
else query(0,0);
}
else query(i+1,tr[k].vis[s[i]-'a']);
}
int main()
{
cin >> s >> n;
for(int i=1;i<=n;i++) build(i);
getfail();
query(0,0);
cout << s << endl;
return 0;
}
提交记录