模板——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)
HDU-2222-Keywords Search(AC自动机模板)