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...