模板——AC自动机

Posted |斗蜂|

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板——AC自动机相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
struct nob{
	int fail,son[27],ed;
}a[1000000];
int cnt=0;
void build (string s){
	int now=0;
	for (int i=0; i<s.length(); i++){
		if (a[now].son[s[i]-‘a‘]==0)
			a[now].son[s[i]-‘a‘]=++cnt;
		now=a[now].son[s[i]-‘a‘];
	}
	a[now].ed++;
}
void fail(){
	queueque;
	for (int i=0; i<26; i++){
		if (a[0].son[i]!=0){
			a[a[0].son[i]].fail=0;
			que.push(a[0].son[i]);
		}
	}
	while (que.size()){
		int pos=que.front();
		que.pop();
		for (int i=0; i<26; i++){
			if (a[pos].son[i]!=0){
				a[a[pos].son[i]].fail=a[a[pos].fail].son[i];
				que.push(a[pos].son[i]);
			}
			else a[pos].son[i]=a[a[pos].fail].son[i];
		}
	}
}
int answer(string s){
	int now=0,ans=0;
	for (int i=0; i<s.length(); i++){
		now=a[now].son[s[i]-‘a‘];
		for (int t=now; t&&a[t].ed!=-1; t=a[t].fail){
			ans+=a[t].ed;
			a[t].ed=-1;
		}
	}
	return ans;
}
int main(){
	int n;
	string s;
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>s;
		build(s);
	}
	a[0].fail=0;
	fail();
	cin>>s;
	cout<<answer(s)<<endl;
	return 0;
}

以上是关于模板——AC自动机的主要内容,如果未能解决你的问题,请参考以下文章

HDU3247 Resource Archiver(AC自动机+BFS+DP)

模板AC自动机

HDU-2222-Keywords Search(AC自动机模板)

POJ3691DNA repair(AC自动机,DP)

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

P3796 模板AC自动机(加强版) 题解(Aho-Corasick Automation)