AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3940
【题解】
和p3942一样的思路(连题目名字都一样),建议先写p3942,我可以说这个东西叫可持久化AC自动机吗?(并没有这个东西)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 100010
int n,cnt,top,end[MAXN],fail[MAXN],deep[MAXN],f[MAXN],q[MAXN],stack[MAXN],tr[MAXN][27];
char b[MAXN],ch[MAXN];
void insert()
{
int now=0,len=strlen(ch+1);
for(int i=1;i<=len;i++)
{
if(!tr[now][ch[i]-'a']) tr[now][ch[i]-'a']=++cnt;
now=tr[now][ch[i]-'a'];
}
end[now]=max(end[now],len);
}
void build()
{
int head=0,tail=0;
for(int i=0;i<26;i++) if(tr[0][i]) q[++tail]=tr[0][i];
while(++head<=tail)
{
int x=q[head];
for(int i=0;i<26;i++)
{
if(!tr[x][i]) tr[x][i]=tr[fail[x]][i];
else {fail[tr[x][i]]=tr[fail[x]][i]; q[++tail]=tr[x][i];}
}
}
}
void find()
{
int len=strlen(b+1);
for(int i=1,x=0;i<=len;i++)
{
f[i]=tr[f[stack[top]]][b[i]-'a'];
stack[++top]=i;
top-=end[f[i]];
}
}
int main()
{
//freopen("cin.in","r",stdin);
//freopen("cout.out","w",stdout);
scanf("%s%d",b+1,&n);
for(int i=1;i<=n;i++) {scanf("%s",ch+1); insert();}
build();
find();
for(int i=1;i<=top;i++) printf("%c",b[stack[i]]);
return 0;
}