1 条题解

  • 0
    @ 2025-12-9 18:43:54

    题意重述

    定义一种操作:对于一个字符串 RR,进行 翻转 操作,得到的新串为

    R+reverse(R[1:R1])R + \text{reverse}(R[1:|R|-1])

    即:在 RR 末尾接上 RR 去掉最后一个字符后的反转。

    例如:

    • abcdabcdcba
    • qwqwq
    • zz

    可以进行若干次(包括 00 次)翻转操作。
    给定一个字符串 SS,已知 SS 是最终串 RR' 的前缀(RR' 是初始串 RR 经过若干次翻转得到的)。
    问:初始串 RR 的长度(R|R|)的可能值是多少?
    只需要输出不超过 S|S| 的可能值,因为所有超过 S|S| 的整数都是可能的(可以通过在 RR 后加足够多的字符再进行翻转使得 SS 为前缀)。


    第一步:分析翻转操作的结构

    R=a1a2anR = a_1 a_2 \dots a_n

    一次翻转后:

    R(1)=a1a2anan1a1R^{(1)} = a_1 a_2 \dots a_n a_{n-1} \dots a_1

    长度变为 2n12n-1

    第二次翻转:对 R(1)R^{(1)} 进行同样的操作,设 R(1)R^{(1)} 长度为 mm,则新串为 R(1)R^{(1)} 接上它的前 m1m-1 个字符的反转。

    我们可以发现,翻转操作后,串总是回文的,并且它的对称中心是原串的最后一个字符。

    更精确地,如果初始串 RR 长度为 nn,经过 kk 次翻转后得到的串长度是 n2k(2k1)n \cdot 2^k - (2^k - 1)

    但是更关键的是结构上的递归性

    f(R)f(R) 表示一次翻转后的串。
    那么 f(R)f(R) 可以看作以 RR 的最后一个字符 ana_n 为中心的回文串。
    f(f(R))f(f(R)) 则是以 f(R)f(R) 的最后一个字符(即 a1a_1)为中心的回文串,等等。


    第二步:转化为回文性质

    设初始串 R=a1a2anR = a_1 a_2 \dots a_n
    进行 tt 次翻转后得到的串记为 PtP_t

    性质 1PtP_t 总是一个回文串。

    性质 2PtP_t 的中心字符是 Pt1P_{t-1} 的第一个字符(当 t1t \ge 1 时),具体地:

    • P0=RP_0 = R(不回文,除非 RR 是回文)。
    • P1P_1 中心是 ana_nRR 的最后一个字符)。
    • P2P_2 中心是 a1a_1RR 的第一个字符)。
    • P3P_3 中心是 an1a_{n-1}RR 的倒数第二个字符),依此类推。

    第三步:SS 是某个 PtP_t 的前缀

    SSPtP_t 的前缀,这意味着 SS 必须满足什么条件?

    由于 PtP_t 是回文串,SS 的前 S|S| 个字符必须与 PtP_t 的前 S|S| 个字符一致,这给出了对 SS 的某些回文约束。

    更具体地,我们可以从 SS推断出 RR 的部分字符的对应关系

    R=XR = X,长度为 nn
    PtP_t 的长度 Lt=n2t(2t1)L_t = n \cdot 2^t - (2^t - 1)

    如果 SSPtP_t 的前缀,那么 SS 必须能写成 PtP_t 的前缀形式,即 Pt[1:S]P_t[1:|S|]


    第四步:对每个可能的 nn 判断可行性

    由于 nSn \le |S|,我们可以枚举 nn(初始长度),然后检查是否存在 t0t \ge 0 使得 SSPtP_t 的前缀。

    但直接枚举 tt 不可行,因为 tt 可能很大。不过 tt 每增加 11,串长翻倍减 11,因此当 nn 固定时,tt 受限于 LtSL_t \ge |S|

    由于 SS 是前缀,我们可以SS 的信息来约束 RR


    关键思路:递归检查

    对于固定的 nn,我们想判断是否存在 tt 使得 SSPtP_t 的前缀。

    考虑递归过程:
    设当前串 QQ 是某个 PkP_k,我们已知 SS 的前 Q|Q| 字符与 QQ 一致(如果 QS|Q| \le |S|)。

    PkP_k 是回文串,中心是某个字符 cc(由 RR 的某个位置决定)。
    Pk+1P_{k+1}PkP_k 进行翻转得到的,长度 2Q12|Q|-1

    如果 SQ|S| \le |Q|,那么我们只需检查 SS 是否是 QQ 的前缀(且 QQ 是某个 PkP_k)。
    如果 S>Q|S| > |Q|,那么 SS 的前 Q|Q| 个字符必须等于 QQ,并且 SS 的剩余部分必须满足 Pk+1P_{k+1} 的结构。

    这提示我们一个递归匹配算法
    从某个初始猜测的 tt 开始,但我们可以反过来:给定 RR,可以直接生成 PtP_t 的前缀,看是否与 SS 匹配。


    第五步:高效算法

    观察:对于固定 nnRR 的字符必须与 SS 中某些位置匹配。
    我们可以通过回文约束推导出 RR 的字符。

    考虑 PtP_t 的结构:它总是关于中心对称的。
    如果 SSPtP_t 的前缀,那么 SS 的某些位置必须相等(回文性质)。

    我们可以枚举 nn,对于每个 nn,尝试用 SS 来填充 RR 的字符,检查是否存在一致的赋值。


    具体做法(官方题解思路):

    定义过程 check(n)

    1. RR 的字符为未知变量 r1,r2,,rnr_1, r_2, \dots, r_n
    2. 我们知道 SS 是某个 PtP_t 的前缀。
      初始 P0=RP_0 = R,如果 Sn|S| \le n,则只需 SSRR 的前缀,即 ri=S[i]r_i = S[i]i=1..Si=1..|S|
      如果 S>n|S| > n,则 SS 的前 nn 个字符必须等于 RR
    3. 然后 P1P_1 长度 2n12n-1,如果 S>n|S| > n,那么 S[n+1..min(S,2n1)]S[n+1..\min(|S|, 2n-1)] 必须等于 R[n1..x]R[n-1..x] 的反转(回文对称部分)。
      这会给出对 RR 的更多约束。
    4. 如果还有超出,继续考虑 P2P_2 等,直到覆盖 SS 的长度。

    在推导过程中,如果出现矛盾(同一个位置应同时等于两个不同字符),则 nn 不可行。


    我们可以模拟这个推导过程,但不必显式生成整个串,而是用两个指针 l,rl, r 表示当前 SS 的匹配范围,并根据回文对称性添加约束。


    第六步:实现方法

    用并查集或直接数组记录每个位置的字符约束。
    RR 的第一位开始,逐步根据 SS 的前缀匹配和回文对称性,推导 RR 的其他位置的字符。

    如果推导完 SS 的所有字符后没有矛盾,则 nn 可行。

    复杂度:对每个 nn,推导过程 O(S)O(|S|),总 O(S2)O(|S|^2) 太慢。
    但注意到 nn 必须满足 nn 是某个可能的初始长度,实际上 nn 必须使得 SS 满足“可以从前缀扩展成某个 PtP_t”的性质。


    第七步:更快速的判定法

    已知 SSPtP_t 的前缀,那么 SS 本身必须是一个回文前缀链

    我们可以从 SS 的末尾开始,利用回文对称性往前推导 RR

    具体做法(逆向推导):

    • 假设我们有了 PtP_t,它的最后一步翻转中心是某个字符。
    • 这个中心字符在 SS 中对应位置是 S[m]S[m]mm 是某个值)。
    • 那么 SS 关于这个中心对称的部分必须相等。

    我们可以枚举最后一次翻转的中心位置,然后向前回溯,看是否能回溯到某个长度 nn


    第八步:最终算法(KMP + 回文)

    实际上,本题标准解法是:

    1. 预处理 SS 的每个前缀是否是回文(可以用 Manacher 或哈希)。
    2. 定义 next[i]next[i] 表示最大的 j<ij < i 使得 S[1..j]S[1..j] 经过若干次翻转可以得到 S[1..i]S[1..i] 的前缀(即 S[1..j]S[1..j] 是某个 PtP_tS[1..i]S[1..i]Pt+1P_{t+1} 的前缀)。
    3. 用类似 KMP 的方式递推 nextnext 数组。
    4. 最终所有可能的 nn 就是 nextnext 链上的所有长度(包括 S|S| 本身)。

    第九步:样例解释

    样例 1:abcdcb

    • 可能长度 4:abcdabcdcba 前 6 字符是 abcdcb
    • 可能长度 6:abcdcb 本身(0 次翻转)✅
    • 输出 4 6

    样例 2:qwqwq

    • 长度 2:qwqwqqwqwq
    • 长度 3:qwqqwqwq
    • 长度 4:qwqwqwqwqwq 前 5 字符是 qwqwq
    • 长度 5:本身 ✅
    • 输出 2 3 4 5

    第十步:总结

    本题核心:

    1. 翻转操作生成回文串。
    2. SS 是某个生成回文串的前缀,对 SS 施加了回文约束。
    3. 通过回文链递推(KMP-like)找出所有可能的初始长度 nn

    复杂度 O(S)O(|S|)


    • 1

    信息

    ID
    5947
    时间
    12000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    11
    已通过
    1
    上传者