题目描述
给定一个字符串
S
,要求对于每个
∑x≤yLCP(x,y)
dan’s
其中LCP是满足以下条件的串 T 的长度
T 是一个回文串- 存在 i≤x ,满足 Si..x=T
- 存在 j≤y ,满足 Sj,y=T
n≤105 ,强制在线
分析
考虑建出回文树,不难分析出来,求的是和前面出现的所有接受态的LCA代表的回文串的长度和。
那么这里LCA的长度和不好算,考虑往下走一条边就会使得代表回文串的长度+2。
那么LCA的长度就可以转化为两点间距离的问题。但是这里需要动态插点,于是就有两种不同的思路。
动态点分治
考虑用替罪羊树的思路来实现对点剖树的维护。具体实现也很简单,主要是这里每次加入的是一个叶子。那么我们每次沿路上溯找到最高的一个不平衡点,进行重构就可以了。
这里重构也很简单,把done标记去掉,然后重新调用一遍build就可以了。
这里仅仅是维护动态点分治是瓶颈的 O(nlog2n)然后询问与所有点之间的距离和就是点剖的简单应用了。
空间复杂度 O(n)
二进制分组+虚树
考虑用二进制分组来维护这个动态加点的东西,维护一个栈,当栈顶俩元素的关键点数相同的时候就提出来,将两者放在一起暴力重构重新塞入栈中即可。
搞出虚树以后,考虑如何算这个到所有点的距离和。
实际上维护三个东西就好,大概就是- 虚树上某个点到其他点的距离和
- 虚树上某个点到子树中关键点的距离和
- 子数中有多少个关键点
每次询问 O(log2n) ,维护二进制分组共 O(nlog2n)
时间复杂度 O(nlog2n)
空间复杂度 O(n)