AC自動機學習筆記

2021-10-20 22:29:04 字數 1742 閱讀 6022

trie+kmp

樸素思想:

當前節點為p,之前已求得fail[p]

trie[p,c]是p 通過字元c指向的 乙個子節點,現要求fail[ trie[p,c] ],即fail[x]

若trie[fail[p],c]存在,則fail[x]=trie[fail[p],c], 即p的子節點的fail = p的fail的子節點

否則,讓p一直跳fail指標,fail[x]=trie[fail[fail[p]],c],直到存在 / 根節點

fail路徑壓縮後,可優化為trie圖

其實就是,在trie上查詢s串的每個字首

在字典樹上走一遍s串,每次累加當前字尾能匹配的個數 (通過跳fail實現)

query_mx時每次都跳fail到根節點,最壞為 o(n*m)

fail樹:所有fail指標連成邊,是一棵樹

即,每個節點的fail指標指向fa,節點0作根

優化:只在fail樹的"末端"節點+1(差分思想),再dfs / 按拓撲序轉移

p3796 【模板】ac自動機(加強版)

p3808 【模板】ac自動機(簡單版)

p5357 【模板】ac自動機(二次加強版)

const

int n=

150+5;

int n;

char s[n][75

], str[

2000010];

int tr[n*70]

[26],idx;

//總字元為 n

int ed[n*70]

, fail[n*70]

;int id[n*70]

;//字串末端的trie節點對應的 id ( id和trie節點相互對映 )

int mp[n*70]

;//id 對映為字串末端的 trie節點

int cnt[n*70]

;vector<

int> mxi;

namespace ac

// ed[p]+=1;

ed[p]

=id;

//1、trie節點對映為模板串id (前提是不存在相同的模板串)

mp[id]

=p;//2、id 對映為 trie節點 (可以重複相同)

}void

build()

}}intquery_cnt

(char s)

return res;

}int

query_mx

(char s)

}fu(i,0

,idx)

if(ed[i]

) mx=

max(mx,cnt[i]);

//列舉0~idx所有節點

fu(i,

0,idx)

if(ed[i]

&& cnt[i]

==mx) mxi.

pb(ed[i]);

//i是trie節點編號,ed[i]才是字串編號

return mx;}}

vector<

int> g[n*70]

;voiddp(

int x)

}int

solve()

intquery_mx_dp

(char s)

return

solve()

;}intwork()

intmain()

AC自動機 學習筆記

是一種數學模型,大概就是由一堆狀態和狀態轉移規則等東西構成,能與外界交換資訊,並改變動作。這個是理論上的東西,了解就行,對ac自動機的理解沒有大影響。通俗的講就是在trie上做kmp,處理多模式串匹配問題。trie 的每個結點就是乙個狀態,根結點是初始狀態。ac自動機的行為被定義為一下3個函式 1....

AC自動機學習筆記

ac自動機是基於字典樹和fail指標來快速一類解決多串匹配的問題。先用所有模式串建乙個字典樹。然後用bfs搞出每個節點的fail指標。fail指標是指向 和當前 字首的字尾有最長匹配的字首。洛谷3808 掃文字串的時候,標記一下訪問過的字典樹上的節點。include using namespace ...

AC自動機學習筆記

title ac自動機學習筆記 date 2020 08 31 15 53 40 tags 8月的最後一天,還是完成了ac自動機的學習。在熟練掌握了kmp後,我發現ac自動機並沒有想象的那麼難,既不難理解,也不難實現,於是決定寫點東西記錄一下。本篇主要談談ac自動機的理論,思想。首先我們必須要明確乙...