回文树在线剖分

回文树在线剖分???

Preface

蒟蒻刚学PAM,就做到一道恶心PAM+LCT题,然而蒟蒻并不会LCT,于是想出一种奇妙的解法,在此分享。欢迎讨论交流。

The problem

Source

IOI2017中国国家队候选队论文集 – 回文树及其应用 翁文涛 – 5.5 AlphaDog(原创)
Also in 本校OJ Problem4427

Description

对于一个串的特殊值F(s)定义为
F ( s ) = ∑ 1 ≤ x ≤ y ≤ ∣ s ∣ L C P ( x , y ) \large F(s)= \sum_{1 \leq x \leq y \leq|s|} LCP(x,y) F(s)=1xysLCP(x,y)
其中LCPLongest Common (suffixal) Palindrome的缩写,也就是说LCP(x,y)表示最长的字符串t的长度,其中t要满足三个条件:

  • t是回文的
  • 存在一个i,满足s[i…x]=t
  • 存在一个j,满足s[j…y]=t

一开始有一个空串s。接下来进行q次插入,每次在串的末尾加入一个新的字符。每次加入后,询问当前串的F值。强制在线

Data Constraint

q ≤ 1 0 5 , Σ 为 小 写 字 符 集 q \leq 10^5 , \Sigma 为小写字符集 q105,Σ

Analysis

容易看出:LCP(x,y) 其实就是 x,y在回文树上的两点 在fail树上的lca处的 len值
每加入一个字符后,F(s)会增加一些值——
Δ F ( s ) = ∑ 1 ≤ i ≤ ∣ s ∣ L C P ( i , ∣ s ∣ ) \large \Delta F(s)=\sum_{1 \leq i \leq |s|}LCP(i,|s|) ΔF(s)=1isLCP(i,s)
这部分我们可以把贡献都放在lca处统计

不强制在线的数据只有20% -_- 只需要先把整颗树跑出来再树剖。

100%

强制在线则容易想到 Link/Cut Tree

不会啊!!!怎么办???

回到树剖——我们的瓶颈在于无法即时得到合适的剖分方式(重儿子)

blingbling 脑中跳出一个回文树的有趣性质

Lemma

x x x 为fail树上一个节点, d i f f [ x ] diff[x] diff[x] x x x F a [ x ] Fa[x] Fa[x] 两点的 L e n Len Len 的差值
x x x 到树根的 f a i l fail fail链,可以划分为 O ( log ⁡ L e n x ) O(\log Len_x) O(logLenx) d i f f diff 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| X=Y。又因为X不同于Y,则 d i f f [ x ] > ∣ X ∣ / 2 diff[x] > |X|/2 diff[x]>X/2 ,那么 L e n f z < 0 Len_{fz}<0 Lenfz<0,则fz只可能为1节点,这时z只要随便选一个满足条件的儿子作son就行啦!

复杂度—— O ( q log ⁡ 2 q ) O(q \log^2 q) O(qlog2q)

Postscript

由于本题的LCT做法不需要cut一类操作,本校其他dalao只码了2.1k。而我用我的剖法码了3.0k。。。

不过从方法的简单易懂来说,还是不错的。还特别创新不是吗,嘻嘻。

大佬们还YY出 平衡规划等 神奇做法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值