迴文樹線上剖分???

Exelite發表於2020-08-23

迴文樹線上剖分???

Preface

蒟蒻剛學PAM,就做到一道噁心PAM+LCT題,然而蒟蒻並不會LCT,於是想出一種奇妙的解法,在此分享。歡迎討論交流。

The problem

Source

IOI2017中國國家隊候選隊論文集 --- 迴文樹及其應用 翁文濤 --- 5.5 AlphaDog(原創)
Also in 本校OJ Problem4427

Description

對於一個串的特殊值F(s)定義為

\[\large F_s= \sum_{1 \leq x \leq y \leq|s|} LCP(x,y) \]

其中LCPLongest Common Palindrome的縮寫,也就是說LCP(x,y)表示最長的字串t的長度,其中t要滿足三個條件:

  • t是迴文的
  • 存在一個i,滿足s[i...x]=t
  • 存在一個j,滿足s[j...y]=t

一開始有一個空串s。接下來進行q次插入,每次在串的末尾加入一個新的字元。每次加入後,詢問當前串的F值。強制線上。

Data Constraint

\[q \leq 10^5 \\\ \large \Sigma 為小寫字符集 \]

Analysis

容易看出:LCP(x,y) 其實就是 x,y在迴文樹上的兩點 在fail樹上的lca處的 len值
每加入一個字元後,F(s)會增加一些值——

\[\large \Delta F(s)=\sum_{1 \leq i \leq |s|}LCP(i,|s|) \]

這部分我們可以把貢獻都放在lca處統計

不強制線上的資料有20% -_- 只需要先把整顆樹跑出來再樹剖

100%

強制線上則容易想到 Link/Cut Tree

不會啊!!!怎麼辦???

回到樹剖——我們的瓶頸在於無法即時得到合適的剖分方式(重兒子)

blingbling 腦中跳出一個迴文樹的有趣性質

Lemma

設x為fail樹上一個節點,diff[x]為 x與 Fa[x] 兩點的 Len 的差值
則 x 到樹根的fail鏈,可以劃分為O(log(Len_x))條 diff 值相等的鏈

引理證明可參考oi-wiki最小回文劃分部分

這樣我們就可以這樣定義x的重兒子son了:son為 x的兒子中 滿足 與 x 的 diff 相等的那個

如果沒有滿足的 那x就沒有son。那如果有多個呢???

這個問題在我碼完3k程式碼後蹦出,嚇了我一跳。事實上,這種情況極少,且不影響做法。

理由:
設 不同的兩點 x,y 有公共父親 z,z 的父親為 fz。設 x,y 所代表的串分別為X,Y。
若 x,y 均滿足成為z的重兒子的條件,則顯然 |X|=|Y|。又因為X不同於Y,則 diff[x] > |X|/2 ,那麼 Len_fz<0,則fz只可能為1節點,這時z只要隨便選一個滿足條件的兒子作son就行啦!

複雜度——O(q log^2 q)

Postscript

由於本題的LCT做法不需要cut一類操作,本校其他dalao只碼了2.1k,而我用我的方法碼了3.0k。。。

不過從方法的簡單易懂來說,還是不錯的。還特別創新不是嗎,嘻嘻。

大佬們還YY出 平衡規劃等 神奇做法。

相關文章