Luogu4482 [BJWC2018] Border 的四种求法
题意:给出字符串
记
则求
这个
这看起来很不好直接使用数据结构维护,可能需要树链分治。
先考虑暴力跳 Parent Tree 的做法。即枚举前缀
这可以线段树合并维护 endpos,然后区间查询。
为了不那么暴力,将树树剖,一个询问就会被拆成对
假设从点
注意,这可能会产生上下重复的路径,但是容易发现答案更劣,所以不用除去。
对于一条重链,我们需要解决如下的子问题:
记
为 SAM 的前缀节点 与当前重链的 LCA 的 。 将重链的节点从浅往深编号为
,记 为第 个节点的 endpos 集合,它是递减的。 每次对一个前缀
,询问 对一个后缀 ,询问
需要考虑的“前缀节点”的数目是每条轻链头的子树大小和,为
第一维
对于第二维
然后使用线段树上二分即可。
写起来大概就是先把询问挂到重链上,然后对每条重链,暴力 DFS 轻子树。
然后离线处理,对每条重链前后扫描线两次,将轻子树依次从上到下加入线段树(不必动态开点),就能得到每个前缀/后缀的状态。
这样空间复杂度就是