BZOJ 3940 Usaco2015 Feb Censoring AC自动机

题目大意:给定一个字符串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;
}


你可能感兴趣的:(AC自动机,bzoj,BZOJ3940)