ac自動機模板及感悟

2021-10-19 21:08:53 字數 921 閱讀 2544

今天第一次打出來了ac自動機這個模板。其一直被稱為樹上的kmp,但我覺得這句話很容易誤導人,還是有些許不同。

首先給一篇csdn上的講解ac自動機

他的核心是構造fail陣列(即kmp中的nxt),用bfs的方法,先讓第一層的所有結點fail只想root,同時將其入佇列。入佇列後的操作較為麻煩,文字描述比較蒼白,我上圖和**。

void

getfail()

}}

還有乙個要注意的地方是詢問時,要把走過的地方標為-1,確保不會再走(這個好像是乙個剪枝的優化)

int ans=

0,x=0;

for(

int i=

0;isize()

;i++

)}

最後有乙個小地方,就是在這道題裡,string比char陣列快(卡了筆者兩個小時,佛了)orz

#include

using

namespace std;

#define maxn 10000000

int n,ch[maxn][30

],fail[maxn]

,tot;

string s,txt;

int num[maxn]

;void

insert

(string s)

num[x]++;

}void

getfail()

}}intmain()

getfail()

; cin>>txt;

int ans=

0,x=0;

for(

int i=

0;isize()

;i++)}

cout<

}

AC自動機模板

ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...

AC自動機模板

ac自動機主要是用於多模式串的匹配問題,按照我的理解,ac自動機就是在tire樹上實現kmp演算法,由於ac自動機加入了失敗指標,所以可以把他看成乙個狀態轉移的圖。給出模板 include include include include includeusing namespace std cons...

模板 AC自動機

我覺得ac自動機的難點和核心是構建失敗指標,父親的失敗指標的兒子 son2 中有和兒子 son1 相同的,即為son1的失敗指標 例 還是有個不懂的地方 第90行,跪求大佬賜教 include include include include include include include inclu...