题目大意:给定一个字符串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; }
BZOJ 3940 Usaco2015 Feb Censoring AC自动机
原文地址:http://blog.csdn.net/popoqqq/article/details/44956461