1 条题解

  • 0
    @ 2026-4-6 15:40:51

    一、问题重述

    定义 f(r)f(r):在二进制字符串 rr同时删除所有子串 10,重复直到无 10
    ss几乎回文当且仅当 f(s)=f(rev(s))f(s) = f(\operatorname{rev}(s))
    求长度为 nn 的几乎回文串数量,模 998244353998244353


    二、已知结论(来自 Hint)

    bib_i 为前 ii 个字符中 1 个数减 0 个数的值,b0=0b_0 = 0
    l=minbil = \min b_ir=maxbir = \max b_i,则 l0rl \le 0 \le r
    f(s)f(s) 完全由 (l,r)(l, r) 决定。
    几乎回文条件等价于 l+r=0l + r = 0nn 为偶数,l+r=1l + r = 1nn 为奇数。


    三、子问题 f(n,m,l,r)f(n, m, l, r)

    定义 f(n,m,l,r)f(n, m, l, r) 为:从 (0,0)(0,0)(n,m)(n, m) 的路径数(步长 (+1,+1)(+1, +1) 对应 1(+1,1)(+1, -1) 对应 0),恰好触及直线 y=x+ly = x + ly=x+ry = x + r(即 bilb_i \ge lbirb_i \le r,且等号至少各取一次)。

    Hint 给出公式:

    $$f(n, m, l, r) = \sum_{k \in \mathbb{Z}} \left[ \binom{n+m}{n - k(r-l)} - \binom{n+m}{n - k(r-l) + r} \right] $$

    其中 n+mn+m 为偶数(因为每步纵坐标变化 ±1\pm 1)。


    四、转化为对称形式

    l=ll' = lr=rr' = r,并令:

    $$n' = \frac{n - (l+r)}{2}, \quad m' = \frac{n + (l+r)}{2} $$

    则原路径映射到从 (0,0)(0,0)(n,m)(n', m') 的路径,新坐标下边界为 y=x+ly = x + ly=x+ry = x + r 的平移。
    恰好触及上下界的路径数由容斥给出:

    $$\begin{aligned} &\; f\!\left(n', m', l, r\right) \\ -&\; f\!\left(n', m', l-1, r\right) \\ -&\; f\!\left(n', m', l, r+1\right) \\ +&\; f\!\left(n', m', l-1, r+1\right) \end{aligned} $$

    五、关键观察(压缩求和)

    注意 n+m=nn' + m' = n,且 mn=l+rm' - n' = l + r
    f(n,m,l,r)f(n', m', l, r) 的展开中,二项式上指标始终为 n+m=nn'+m' = n,与 l,rl, r 无关。
    下指标为:

    nk(rl)=n(l+r)2k(rl)n' - k(r-l) = \frac{n - (l+r)}{2} - k(r-l)

    以及加上 rr 的类似项。

    固定 k=rlk = r-l(极差)时,l+rl+r 只有两种可能:0011(由 nn 奇偶性决定)。
    因此对每个 kk,只需考虑 l+r=0l+r = 0l+r=1l+r = 1 两种情况,且 l=(l+r)k2l = \frac{(l+r)-k}{2}r=(l+r)+k2r = \frac{(l+r)+k}{2}
    此时下指标随 pp 变化形成等差数列,公差为 k+2(l+r)k+2-(l+r)(见标程中的 k+2tk+2-t)。


    六、标程中的 calc(k,t)calc(k, t)

    标程定义 calc(k,t)calc(k, t),其中:

    • t=0t = 0 对应 l+r=0l+r = 0
    • t=1t = 1 对应 l+r=1l+r = 1

    l=tk2l = \frac{t - k}{2}r=t+k2r = \frac{t + k}{2}
    代入公式后,下指标为:

    nt2p(k+2t)\frac{n - t}{2} - p \cdot (k + 2 - t)

    以及加上 rr 的项。
    calc(k,t)calc(k, t) 的四个循环分别实现:

    1. 主项 (n...)\sum \binom{n}{...} 的正部分(区间和)
    2. 主项中的负修正(单个组合数乘系数 k+1tk+1-t
    3. 反射项的正部分(区间和,从 p=1p=1 开始)
    4. 反射项的负修正(单个组合数)

    最终 calc(k,t)calc(k, t) 计算出固定 kktt 下的所有 l,rl, r 对应的路径数之和(即所有满足极差 =k=kl+r=tl+r=t 的字符串数量)。


    七、最终答案的累加

    对于每个 kk,若 n+kn+k 为偶数(否则无合法路径),则:

    • t=0t=0 的贡献为 calc(k,0)calc(k, 0)
    • t=1t=1 的贡献为 calc(k,1)calc(k, 1)

    标程中的累加方式:

    cadd(ans, x);
    cadd(ans, x = calc(i, 0));
    y = calc(i, 1);
    csub(ans, add(y, y));
    

    其中 xx 初始为 00
    这等价于对每个 kk,加上 calc(k,0)calc(k,0),减去 2calc(k,1)2 \cdot calc(k,1)
    这是因为最终答案的公式(从 Hint 4 推导)为:

    $$\text{ans} = \sum_{k} \left( \text{count}_{l+r=0} - 2 \cdot \text{count}_{l+r=1} \right) $$

    其中 countl+r=t=calc(k,t)\text{count}_{l+r=t} = calc(k, t)


    八、复杂度分析

    对于每个 kkcalc(k,t)calc(k, t) 中的循环次数约为 O(n/k)O(n/k)
    求和 k=1nn/k=O(nlogn)\sum_{k=1}^n n/k = O(n \log n)
    预处理组合数 O(n)O(n)
    总复杂度 O(nlogn)O(n \log n),满足 n106n \le 10^6


    九、代码细节对应

    • a[i] 存储 (ni)\binom{n}{i}998244353998244353s[i] 为前缀和。
    • ask(l, r)i=lra[i]\sum_{i=l}^r a[i]
    • init 预处理逆元,用于递推组合数。
    • 主循环中 for (int i = 1; i <= n; i++) 枚举极差 k=ik = i
    • if (n + i & 1) continue; 确保 nnkk 同奇偶,否则无合法路径。

    十、总结

    本题通过:

    1. 将二进制串映射为格路
    2. 利用反射原理得到恰好触及边界的路径计数公式
    3. 固定极差 kk 并利用等差数列性质压缩求和
    4. 预处理组合数及其前缀和实现 O(nlogn)O(n \log n) 查询

    最终得到长度为 nn 的几乎回文串数量。标程完全遵循这一推导,代码中的 calc(k,t)calc(k, t) 直接实现了压缩后的求和。

    • 1

    信息

    ID
    6449
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    0
    已通过
    0
    上传者