【湖南集训 4.4】Alphadog

题目描述

给定一个字符串 S ,要求对于每个y[0,n),求如下的式子

xyLCP(x,y)

dan’s
其中LCP是满足以下条件的串 T 的长度

  • T是一个回文串
    • 存在 ix ,满足 Si..x=T
    • 存在 jy ,满足 Sj,y=T
    • n105 ,强制在线


      分析

      考虑建出回文树,不难分析出来,求的是和前面出现的所有接受态的LCA代表的回文串的长度和。
      那么这里LCA的长度和不好算,考虑往下走一条边就会使得代表回文串的长度+2。
      那么LCA的长度就可以转化为两点间距离的问题。

      但是这里需要动态插点,于是就有两种不同的思路。

      动态点分治

      考虑用替罪羊树的思路来实现对点剖树的维护。具体实现也很简单,主要是这里每次加入的是一个叶子。那么我们每次沿路上溯找到最高的一个不平衡点,进行重构就可以了。
      这里重构也很简单,把done标记去掉,然后重新调用一遍build就可以了。
      这里仅仅是维护动态点分治是瓶颈的 O(nlog2n)

      然后询问与所有点之间的距离和就是点剖的简单应用了。

      空间复杂度 O(n)

      二进制分组+虚树

      考虑用二进制分组来维护这个动态加点的东西,维护一个栈,当栈顶俩元素的关键点数相同的时候就提出来,将两者放在一起暴力重构重新塞入栈中即可。

      搞出虚树以后,考虑如何算这个到所有点的距离和。
      实际上维护三个东西就好,大概就是

      • 虚树上某个点到其他点的距离和
      • 虚树上某个点到子树中关键点的距离和
      • 子数中有多少个关键点

      每次询问 O(log2n) ,维护二进制分组共 O(nlog2n)

      时间复杂度 O(nlog2n)
      空间复杂度 O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值