BZOJ 3940 Usaco2015 Feb Censoring AC自动机

题目大意:给定一个字符串A和一些模板串,要求删除A中所有的模板串后输出

同3942,,由于是多串所以把KMP换成AC自动机即可

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 100100using 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;elseroot->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];}elsep->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自动机

相关文章:

你感兴趣的文章:

标签云: