回文树在线剖分???

回文树在线剖分???

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出 平衡规划等 神奇做法。

你可能感兴趣的:(回文树在线剖分???)