【湖南集训 4.4】Alphadog

本文介绍了一种利用回文树结合动态点分治或二进制分组及虚树解决特定字符串问题的方法。该问题要求对于给定字符串,求解一系列涉及回文子串长度之和的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个字符串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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值