题目大意:给定一个字符串A和一些模板串,要求删除A中所有的模板串后输出
同3942,由于是多串所以把KMP换成AC自动机即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
int n;
char s[M],_s[M];
namespace Aho_Corasick_Automaton{
struct Trie{
Trie *son[26],*fail;
int max_len;
void* operator new (size_t)
{
static Trie mempool[M],*C=mempool;
return C++;
}
}*root=new Trie;
void Insert(char *s)
{
Trie *p=root;int i;
for(i=1;s[i];i++)
{
if(!p->son[s[i]-'a'])
p->son[s[i]-'a']=new Trie;
p=p->son[s[i]-'a'];
}
p->max_len=max(p->max_len,i-1);
}
void Build_Tree()
{
static Trie *q[M];
int i,r=0,h=0;
for(i=0;i<26;i++)
if(root->son[i])
(q[++r]=root->son[i])->fail=root;
else
root->son[i]=root;
while(r!=h)
{
Trie *p=q[++h];
for(i=0;i<26;i++)
if(p->son[i])
{
p->son[i]->fail=p->fail->son[i];
p->son[i]->max_len=max(p->son[i]->max_len,p->son[i]->fail->max_len);
q[++r]=p->son[i];
}
else
p->son[i]=p->fail->son[i];
}
}
}
using namespace Aho_Corasick_Automaton;
char stack[M];
Trie *a[M];
int top;
int main()
{
int i;
scanf("%s",s+1);
cin>>n;
for(i=1;i<=n;i++)
scanf("%s",_s+1),Insert(_s);
Build_Tree();
a[0]=root;
for(i=1;s[i];i++)
{
stack[++top]=s[i];
a[top]=a[top-1]->son[s[i]-'a'];
if(a[top]->max_len)
top-=a[top]->max_len;
}
stack[top+1]=0;
puts(stack+1);
return 0;
}