AC自动机模板题(膜jcvb代码)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <queue> using namespace std; char s[],tt[],Ans[];
int ch[][],Fail[],lab[],cnt,nv[]; void Add(const char * str)
{
int p=,i;
for(i=;str[i];++i)
{
if(!ch[p][str[i]-])ch[p][str[i]-]=++cnt;
p=ch[p][str[i]-];
}
lab[p]=i-;
return ;
} void Build()
{
int i,t; queue<int> Q;
Q.push();
while(!Q.empty())
{
t=Q.front();Q.pop();
for(i=;i<;++i)
{
if(ch[t][i])
{
Q.push(ch[t][i]);
Fail[ch[t][i]]=t?ch[Fail[t]][i]:;
}
else ch[t][i]=ch[Fail[t]][i];
}
}
return ;
} int main()
{
int i,q,p,top=; scanf("%s",s+);
scanf("%d",&q);
for(i=;i<=q;++i)
{
scanf("%s",tt+);
Add(tt);
} Build();
p=;
for(i=;s[i];++i)
{
p=ch[p][s[i]-];
++top;
Ans[top]=s[i];
nv[top]=p;
if(lab[p])top-=lab[p],p=nv[top];
} for(i=;i<=top;++i)printf("%c",Ans[i]); printf("\n");
return ;
}