【学习笔记】AC 自动机
听老师说 AC 自动机不算自动机啊,因为 Wikipedia 上的说法也是 $Aho–Corasick algorithm$ 而不是 $Aho–Corasick Automaton$.
然鹅既然大家都这么叫了我标题也就这么起喽 or2
原理
和往常一样,先坑着。。。
例题
模式串匹配
先上个洛谷模板的代码。题目很裸(毕竟是简单模板),给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。
代码
#include
#define ll long long
#define maxn 1000010
using namespace std;
struct Node{
int vis[26];
int fail,end;
};
struct ACA{
Node AC[maxn];
int cnt;
void Build(string x){
int now=0,lx=x.length();
for (int i=0;iq;
for (int i=0;i<26;i++) if (ac[0].vis[i]) ac[ac[0].vis[i]].fail="0," q.push(ac[0].vis[i]); while(!q.empty()){ int hq="q.front();" q.pop(); for (int i="0;i<26;i++)" (ac[hq].vis[i]) ac[ac[hq].vis[i]].fail="AC[AC[hq].fail].vis[i]," q.push(ac[hq].vis[i]); else ac[hq].vis[i]="AC[AC[hq].fail].vis[i];" } query(string x){ ans="0,now=0;" lx="x.length();" now="AC[now].vis[x[i]-'a'];" t="now;t&&AC[t].end!=-1;t=AC[t].fail){" ans+="AC[t].end;" ac[t].end="-1;" return ans; }tat; main(){ ios::sync_with_stdio(false); n; cin>>n;
for (int i=1;i<=n;i++){ string x; cin>>x;
TAT.Build(x);
}
TAT.Get_Fail();
string s;
cin>>s;
cout<