字串 2 AC自動機

2021-06-29 05:03:07 字數 1428 閱讀 1111

ac自動機,其實就是trie樹與kmp的結合,且有dfa(有限狀態機)的性質.

理解的關鍵點:

1. fail指標 起到回溯作用

2.每次匹配都是主串不動,移動指標now去回溯找字尾的字首

3.乙個優化點,將null指向root 編碼更簡單.

考察時一般也會問道dfa的性質.

ac自動機解決問題:

1.多模式串匹配

2.給定乙個長度,滿足xx條件能構造多少個.

abcd 多模式串匹配

ef dfa轉移,求共有狀態數,矩陣加速.

模板

#include#include#include#include#include#includeusing namespace std;

const int maxn=500010;

const int inf=0x3f3f3f3f;

const int chart=128;

/**構造trie樹需要的next[26]

指向下個節點(26)失敗指標fail

到此是否為word end

根root 大小 sz

函式 init()初始化root與sz newnode() 清空next 設定end

insert ac_build query

**/struct ac

int newnode()

void insert(char*s,int type,int k)

end[now]++;

id[now]=k;

yp[now]=type;

}void build()

int newnode()

void insert(char*s,int type,int k)

end[now]++;

id[now]=k;

yp[now]=type;

}void build()

}/** 這種寫法將root下沒有字元的next都指向自身 這樣避免了query時的額外判斷

將next沒有指向的改為父親失配指標指向的"同字元"並不改變ac自動機的特徵

這樣無非兩種情況,(長度定然小於失配處的長度bfs) 一種它有就指向,另一種root

**//**

求fail指標利用迭代的思想,跟與自己直接相連的上乙個字元掛鉤

這裡next[now][i] 分兩種情況

第一種該值等於-1,那麼我們優化當走到該點時直接走到fail處,於是將next的值與之相連

第二種該值不為-1,那麼fail指向處就是解,因為上一種情況的存在使得不會使fail指向null

**/ while(!q.empty())}}

}void query(char*s)

tmp=fail[tmp];}}

}}ac;

int main()

AC自動機模版 字串

ac自動機主要用於解決多模式串的匹配問題 具體指的是 如下圖中 模式串 p中有多個 字串,問這些字串在 主串s的出現的總次數 是字典樹 trie樹 的變種,一種偽樹形結構 主體是樹形的,但是由於加入了失敗指標,使得它變成了乙個有向圖 以當前節點為終點的 模式字串 的數量 int fail 1 fai...

字串應用之AC自動機

ac 自動機的用處 查詢目標串中出現了哪些模式串 即文字字串 s 中出現了哪些字典中的單詞 一種字串上的 dp fail 樹應用 ac 自動機的演算法分三步 構建所有 單詞 的 trie 樹 構建失配指標 模式匹配過程 1.void trie is end now true 2.自動機中乙個節點 p...

AC自動機(字串多模匹配)

非常經典的乙個關於字串匹配的演算法 前置技能是 kmp和trie 重難點是fail指標 其實挺簡單的 其實不一定要會kmp,只要會它的思想就行了。所謂fail邊,其實就是乙個失敗指標,與kmp的next指標 類似於失敗指標,詳見我的kmp的部落格裡的p陣列 不同的是,next是對於乙個串而言的,而f...