虛線部分代表fail指標
ac自動機模板題鏈結
靜態陣列版本(推薦:**量少易寫,更快易寫):
#include
using
namespace std;
class
aho_corasick
/*儲存結構:trie樹*/
void
insert
(const
char
* str)
cnt[p]++;
}void
build_fail()
while
(!q.
empty()
)}}}
intquery
(const
char
* str)
else
break
;/*寫法2:
ans += cnt[temp];
cnt[temp] = 0;*/
tmp = fail[tmp];}
}return ans;
}private
:static
const
int childcnt =26;
static
const
int n =
500005
;int son[n]
[childcnt]
, cnt[n]
, idx;
// 0既是root又是null
int fail[n];}
;const
int maxn =
1e7+5;
char key[70]
;char pattern[maxn]
;int n;
aho_corasick ac;
intmain()
scanf
("%s"
, pattern)
; ac.
build_fail()
;printf
("%d\n"
, ac.
query
(pattern));
}return0;
}
指標優化版本:
#include
using
namespace std;
class
aho_corasick
/*儲存結構:trie樹*/
void
insert
(const
char
* word)
tmp-
>sum++;}
void
build_fail()
root-
>child[i]
->fail = root;
q.push
(root-
>child[i]);
}while
(!q.
empty()
)/*和靜態陣列版本相似補邊,狀態壓縮*/
else cur-
>child[i]
= cur-
>fail-
>child[i];}
}}intquery
(char
* ch)
else
break
;/*另一寫法
ans += tmp->sum;
tmp->sum = 0;*/
tmp = tmp-
>fail;}}
return ans;
}private
:static
const
int childcnt =26;
struct node }
; node* root;};
const
int maxn =
1e7+5;
char key[70]
;char pattern[maxn]
;int n;
intmain()
scanf
("%s"
, pattern)
; ac.
build_fail()
;printf
("%d\n"
, ac.
query
(pattern));
}return0;
}
指標無優化版本:
#include
using
namespace std;
class
aho_corasick
/*儲存結構:trie樹*/
void
insert
(const
char
* word)
tmp-
>sum++;}
void
build_fail()
/*fail指標構建規則:首先在fathe***il指標尋找當前字元是否存在
如果不存在則繼續跳fail指標直到直到該字元或者fathe***il為空
如果fathe***il最後為空則設定當前節點的fail為root
否則就設定為fathe***il->child[i]*/
while
(!q.
empty()
) p = p-
>fail;}if
(!p) cur-
>child[i]
->fail = root;
q.push
(cur-
>child[i]);
}}}}
intquery
(char
* ch)
else
break
;/*另一寫法
ans += tmp->sum;
tmp->sum = 0;*/
tmp = tmp-
>fail;}}
return ans;
}private
:static
const
int childcnt =26;
struct node }
; node* root;};
const
int maxn =
1e7+5;
char key[70]
;char pattern[maxn]
;int n;
intmain()
scanf
("%s"
, pattern)
; ac.
build_fail()
;printf
("%d\n"
, ac.
query
(pattern));
}return0;
}
AC 自動機 多模式串匹配
上的敏感詞過濾是怎麼實現的呢?實際上,這些功能最基本的原理就是字串匹配演算法,也就是通過維護乙個敏感詞的字典,當使用者輸入一段文字內容後,通過字串匹配演算法來檢查使用者輸入的內容是否包含敏感詞。bf rk bm kmp 演算法都是針對只有乙個模式串的字串匹配演算法,而要實現乙個高效能的敏感詞過濾系統...
AC自動機(多模式匹配)
ac自動機主要解決的問題 多模式匹配 kmp則屬於單模式匹配 n個單詞在m個字元的文章中,出現過多少次。主要分三步 構建trie樹 構建失敗指標 尋找匹配個數 trie樹 又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。具體參見 失敗指標 作...
ac自動機 匹配最長字首 多模匹配 AC自動機
精確的字串匹配演算法有 單模匹配演算法,比如,kmp bm演算法等 和 多模匹配演算法,比如,wu manber ac演算法等。ac演算法 aho corasick 是kmp演算法向多模式串情形的擴充套件,該演算法使用一種特殊的自動機,即ac自動機。ac自動機由一組模式串p生成,是trie的擴充套件...