板子不再贅述,oi-wiki有詳細講解。
\(query\)函式則是遍歷文字串的所有位置,在文字串的每個位置都沿著\(fail\)跳到根,將沿途所有元素答案++。意義在於累計所有以當前字元為結尾的所有模式串的答案。看**就能很容易的理解。
另外\(e[i]\)記錄的是第\(t\)個模式串結尾是哪個節點(所有節點均有唯一的編號)。
貼個p5357 【模板】ac自動機(二次加強版)板子:
#include#include#include#include#include#include#define maxn (int)(2e6+10000)
int ch[(int)(2e5+1000)][30],fail[maxn],cnt,e[maxn],nex[maxn],n,myque[maxn],ans[maxn],head[maxn],idx;
using namespace std;
char s[(int)(2e6+1)];
char data[maxn];
struct gg side[maxn*2];
void ins(int u,int v) ;head[u]=idx;
}void init()
void insert(int t)
上述方法將建圖+匹配的複雜度成功優化為了 $ ac自動機模版
字尾陣列 include include include using namespace std const int maxn 200000 100 int wa maxn wb maxn wv maxn ws maxn int rank maxn height maxn int sa maxn r...
模版 AC自動機
模版 ac自動機 可以在文字串中查詢多個模式串。前置知識點 kmp 演算法 trie 樹 開了乙個 fai l i fail i fail i 陣列 存的是 tri etrie trie 樹上的結點號 表示 tri etrie trie 樹 某個結點 在 文字串上 第 tri e i j trie ...
模版 AC自動機(簡單版)
這是一道簡單的ac自動機模版題。用於檢測正確性以及演算法常數。為了防止卡oj,在保證正確的基礎上只有兩組資料,請不要惡意提交。給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸...