回文树在线剖分???
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)=1≤x≤y≤∣s∣∑LCP(x,y)
其中LCP即Longest 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 为小写字符集 q≤105,Σ为小写字符集
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)=1≤i≤∣s∣∑LCP(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出 平衡规划等 神奇做法。