LOJ#6198. 謝特【後綴自動機/數組 + Trie樹查異或最大值 + Trie樹合併】

題目描述:

在這裏插入圖片描述
n105,wi<nn\le10^5,w_i<nLOJ題目鏈接

題目分析:

看到兩個後綴的LCP就想到後綴自動機或者後綴數組

先從後綴自動機的思路入手,我們知道兩個後綴的LCP就是它們在後綴自動機fail樹上的LCA的len。
所以這道題就變成了:在fail樹上,求uu點的不同子樹內的wi xor wjw_i~\text{xor} ~w_j的最大值。

需要Trie樹合併,查詢異或最大值。
合併的話,可以啓發式合併(暴力插入),但是需要遍歷子樹內的點,查詢也可以暴力遍歷小的子樹到大的子樹裏面查詢,但是空間複雜度是O(nlog2n)O(n\log^2n)的,可以改爲樹上DSU,空間複雜度降爲O(nlogn)O(n\log n),時間複雜度O(nlog2n)O(n\log^2n),比如這份提交

但是Trie樹合併可以像線段樹合併一樣,並且因爲不需要可持久化,所以合併的空間和時間複雜度都可以降爲O(nlogn)O(n\log n)
查詢的話也不需要遍歷子樹,因爲是查兩棵Trie樹異或出的最大值,在兩棵樹同一層的點對(x,y)(x,y),對於lc[x]lc[x],它優先會選擇rc[y]rc[y],如果沒有rc[y]rc[y]則會選擇lc[y]lc[y],也就是說lc[x]lc[x]所對應的第二棵樹的節點是確定的,所以dfs求解的點對數就是小的Trie樹裏的點數。
這個寫法可以參見我的提交

後綴數組的解法可以根據height值建出笛卡爾樹,查詢就暴力遍歷小子樹的點到大子樹的Trie中查詢。
但是此時的Trie樹實際上是一個區間,於是可以用類似主席樹的形式寫可持久化Trie樹然後做差,比如這份提交

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章