1 条题解

  • 0
    @ 2025-8-24 22:35:06

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zhouhuanyi
    在量子世界中,所有的未来都同样真实。

    搬运于2025-08-24 22:35:06,当前版本为作者最后更新于2023-09-19 21:09:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    先考虑一个 O(nq)O(nq) 的暴力,令 s1=S[l1,r1],s2=S[l2,r2]s_{1}=S[l_{1},r_{1}],s_{2}=S[l_{2},r_{2}],令 t=rev(s2)t=\operatorname{rev}(s_{2}),则我们仅需求 $s_{1}=A+B+C,t=\operatorname{rev}(A)+B+\operatorname{rev}(C)$ 的数量,对于每一个前缀和后缀求出其翻转是否与其相等即可,这个可以通过 kmp\text{kmp} 快速求出。

    注意到翻转与自身相等的前缀为 s1+s2s_{1}+s_{2} 的一个 border(\text{border}(后缀同理)),所以其也是满足 border\text{border} 理论的性质的,其形成了 log\log 段等差数列,如果使用基本子串字典模型求解出 log\log 段等差数列,那么如果能快速求解前缀与后缀两段等差数列之间的贡献,则可以做到 O(qlog2n)O(q\log^2 n) 的复杂度。

    现在快速求两段等差数列之间的贡献,考虑以下两种情况:

    11.这两段等差数列对应的 border\text{border} 不交:

    相当于 $s_{1}=(A+B+A+B+...+A)+E+(C+D+C+D+...+C),t=(\operatorname{rev}(A)+\operatorname{rev}(B)+\operatorname{rev}(A)+\operatorname{rev}(B)+...+\operatorname{rev}(A))+F+(\operatorname{rev}(C)+\operatorname{rev}(D)+\operatorname{rev}(C)+\operatorname{rev}(D)+...+\operatorname{rev}(C))$ 的一个形式,注意到我们统计答案时仅与 EE 是否 FF 相等,B+AB+A 是否与 rev(B)+rev(A)\operatorname{rev}(B)+\operatorname{rev}(A) 相等,C+DC+D 是否与 rev(C)+rev(D)\operatorname{rev}(C)+\operatorname{rev}(D) 相等有关,可以非常方便的统计。

    22.这两段等差数列对应的 border\text{border} 有交:

    比较难以处理的一部分,但可以发现必然有一个超过了一半,所以单组询问枚举的量级是 O(logn)O(\log n) 级别的,于是可以使用一些更加暴力的方法来维护。

    判定中间的两个串相等需要一些证据的支持,但可以发现由于两段已经覆盖满了整个串,所以证据是充足的,即对于中间的两个串的每个位置两个中至少有一个可以参与判定,先将其中有一个取到最长的判掉,这部分在求出第一次使得两侧不交的位置后级可以转化为 case1\text{case1} 的情况维护。

    现在仅需考虑两侧均不取到最长的情况,容易发现判定相等的证据来源与 A+BA+Brev(A)+rev(B)\operatorname{rev}(A)+\operatorname{rev}(B)lcp\text{lcp}C+DC+Drev(C)+rev(D)\operatorname{rev}(C)+\operatorname{rev}(D)lcs\text{lcs},特别的当 A+B=rev(A)+rev(B)A+B=\operatorname{rev}(A)+\operatorname{rev}(B)C+D=rev(C)+rev(D)C+D=\operatorname{rev}(C)+\operatorname{rev}(D) 时其各自产生的限制是自由的,即认为时刻相等,但当这两个情况有任意一个不满足时,对应的 lcp,lcs\text{lcp},\text{lcs} 即可看作一条限制,限制中间的两个串的长度不能超过 lcp\text{lcp}lcs\text{lcs}

    至此我们将其转化为了纯粹的对中间的串的长度的限制,其要在 [0,r][0,r] 内,那么相当于统计在两个等差序列 A,BA,B 分别取两个元素 x,yx,yx+y[L,R]x+y\in [L,R] 的方案数,这个是经典类欧问题,可以做到 O(logn)O(\log n)

    加上求解基本子串字典,复杂度为 O(nlog2n+qlog2n)O(n\log^2 n+q\log^2 n),如果使用复杂度更小的基本子串字典可以做到 O(nlogn+qlog2n)O(n\log n+q\log^2 n)

    • 1

    信息

    ID
    6829
    时间
    1000~5000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者