不會 字尾自動機

2022-03-16 13:57:21 字數 1186 閱讀 5893

沿dag往下走是在末尾加字元

沿fail樹往下走是在開頭加字元

fail樹上fa是最長字尾,是endpos集合最小擴充。

「弦論」

t=0時即是dag上dp

t=1是加上endpos集合大小的權,fail樹預處理

「諸神眷顧的幻想鄉」

廣義字尾自動機,列舉葉子當根就能遍歷所有序列

「公共串」

廣義字尾自動機,匹配的過程中維護乙個變數表示匹配的長度,

在sam節點上留下痕跡。

「差異」

fail樹上lca代表lcs

於是可以把串reverse,把求lcp變成求lcs

「工藝」

複製一遍接在後面,建出sam

然後dag上貪心走字典序最小,走n步

「生成魔咒」

建邊用map

「品酒大會」

看到lcs猜想可以fail樹上dp,然後發現真的可以

「cheat」

首先要二分答案,但是只知道每個位置能匹配的最長長度,不知道在哪匹配最合適

所以上單調佇列優化dp

「你的名字」

這題好猛啊

考慮[1,|s|],則只需讓t在s上跑匹配,同時找到t上符合條件的位置打標記

考慮[l,r],需要知道當前的字尾自動機中哪些部分在[l,r]是有意義的

考慮跑匹配時用到了哪些東西

1.trans[26]陣列

2.len用來更新目前最長匹配長度

3.fail用來失配跳轉

然而我們發現fail陣列直接使用最終的就可以,因為不會漏掉應該找到的最長字尾,

如果找到了區間中沒有的最長字尾可以通過1.2.兩項弄掉

然後考慮len陣列,發現乙個節點的len從他被初始化開始就不再變化,所以也不用管了

但是由於存在l的限制,導致它在被使用(更新目前最長匹配長度)時需要注意乙個地方。

考慮乙個endpos=p的節點i,若p-len[i]+1最後考慮trans,能到達節點trans[i][j]的最低條件仍然為p[trans[i][j]]-len[trans[i][j]]+1>=l

最後發現問題集中到了我們要維護p

這個p是可以建完sam的最後,一發線段樹合併解決的。

而我是個rz連線段樹合併都不會。

線段樹合併是,對於重複的節點,新開節點記錄資訊之和,否則直接改一下兒子就行了

千萬別暴力遍歷所有的節點...

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...

字尾自動機

常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...

字尾自動機

基礎學習 簡潔明瞭的講解 總狀態數不超過2n 12n 1 2n 1 包括初始狀態 統計每個end po sendpos endpos 等價類出現位置數量時,要按長度從長到短的計算cnt cntcn t。那為什麼一定要從長到短呢?比如回文自動機就直接是按照節點編號從大到小計算cnt cntcn t 罪...