乙個串的border定義為既是它字首又是它字尾的串。
乙個串的border的長度排序後構成log個等差數列。
對於長度大於串長一半的border而言,任意兩個border相差乙個週期。
對於長度小於串場一半的border而言,可以利用如下性質分析:
設border a,b,len a 一種類似於ac自動機的構建方法。注意0節點的長度是-1,它代表長度為-1的奇回文串(非常詭異)fail[1]的指向是0以方便處理。
由上文得,乙個串的border長度為log個等差數列。又因在回文子串上考慮,故border與回文子串一一對應。假設我們考慮的是乙個鏈底的點,那麼它的fail必然在之前出現過且是乙個border,並且由於等差數列和border性質,在考慮border時獲得的dp值與當前用最長的回文串最後劃分相同,而當前沒有考慮的只有等差數列中最短的乙個子串作為最後乙個子串時的答案。用之更新即可。
字尾平衡樹
如果需要動態維護字尾陣列,支援在字串前端插入乙個字元,詢問字尾的大小關係,如何做呢?這是乙個不斷插入的問題,可以從增量的角度考慮。我們在前端插入乙個字元,其實就是插入了乙個新的字尾。我們的問題其實就是這個字尾排名多少。我們可以用平衡樹維護一下字尾陣列,從根節點開始二分比較這個字尾的大小,看看它應該被...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
樹鏈剖分詳解及模板
這幾天學習了一下樹鏈剖分,順便寫一下我的理解 早上看了一下別人的講解,雲裡霧裡,終於算是搞懂了 樹鏈剖分是解決在樹上進行插點問線,插線問點等一系列樹上的問題 假如現在給你一棵樹,然後沒兩條邊之間有一條權值,有一些操作,1 x y之間的最大權值是多少,2 改變x y之間的權值 那麼就要想想辦法了,我們...