題目描述:
題目分析:
看到兩個後綴的LCP就想到後綴自動機或者後綴數組
先從後綴自動機的思路入手,我們知道兩個後綴的LCP就是它們在後綴自動機fail樹上的LCA的len。
所以這道題就變成了:在fail樹上,求點的不同子樹內的的最大值。
需要Trie樹合併,查詢異或最大值。
合併的話,可以啓發式合併(暴力插入),但是需要遍歷子樹內的點,查詢也可以暴力遍歷小的子樹到大的子樹裏面查詢,但是空間複雜度是的,可以改爲樹上DSU,空間複雜度降爲,時間複雜度,比如這份提交。
但是Trie樹合併可以像線段樹合併一樣,並且因爲不需要可持久化,所以合併的空間和時間複雜度都可以降爲。
查詢的話也不需要遍歷子樹,因爲是查兩棵Trie樹異或出的最大值,在兩棵樹同一層的點對,對於,它優先會選擇,如果沒有則會選擇,也就是說所對應的第二棵樹的節點是確定的,所以dfs求解的點對數就是小的Trie樹裏的點數。
這個寫法可以參見我的提交。
後綴數組的解法可以根據height值建出笛卡爾樹,查詢就暴力遍歷小子樹的點到大子樹的Trie中查詢。
但是此時的Trie樹實際上是一個區間,於是可以用類似主席樹的形式寫可持久化Trie樹然後做差,比如這份提交。