1 条题解
-
0
题意重述
定义一种操作:对于一个字符串 ,进行 翻转 操作,得到的新串为
即:在 末尾接上 去掉最后一个字符后的反转。
例如:
abcd→abcdcbaqw→qwqz→z
可以进行若干次(包括 次)翻转操作。
给定一个字符串 ,已知 是最终串 的前缀( 是初始串 经过若干次翻转得到的)。
问:初始串 的长度()的可能值是多少?
只需要输出不超过 的可能值,因为所有超过 的整数都是可能的(可以通过在 后加足够多的字符再进行翻转使得 为前缀)。
第一步:分析翻转操作的结构
设 。
一次翻转后:
长度变为 。
第二次翻转:对 进行同样的操作,设 长度为 ,则新串为 接上它的前 个字符的反转。
我们可以发现,翻转操作后,串总是回文的,并且它的对称中心是原串的最后一个字符。
更精确地,如果初始串 长度为 ,经过 次翻转后得到的串长度是 。
但是更关键的是结构上的递归性:
设 表示一次翻转后的串。
那么 可以看作以 的最后一个字符 为中心的回文串。
则是以 的最后一个字符(即 )为中心的回文串,等等。
第二步:转化为回文性质
设初始串 。
进行 次翻转后得到的串记为 。性质 1: 总是一个回文串。
性质 2: 的中心字符是 的第一个字符(当 时),具体地:
- (不回文,除非 是回文)。
- 中心是 ( 的最后一个字符)。
- 中心是 ( 的第一个字符)。
- 中心是 ( 的倒数第二个字符),依此类推。
第三步: 是某个 的前缀
是 的前缀,这意味着 必须满足什么条件?
由于 是回文串, 的前 个字符必须与 的前 个字符一致,这给出了对 的某些回文约束。
更具体地,我们可以从 中推断出 的部分字符的对应关系。
设 ,长度为 。
的长度 。如果 是 的前缀,那么 必须能写成 的前缀形式,即 。
第四步:对每个可能的 判断可行性
由于 ,我们可以枚举 (初始长度),然后检查是否存在 使得 是 的前缀。
但直接枚举 不可行,因为 可能很大。不过 每增加 ,串长翻倍减 ,因此当 固定时, 受限于 。
由于 是前缀,我们可以用 的信息来约束 。
关键思路:递归检查
对于固定的 ,我们想判断是否存在 使得 是 的前缀。
考虑递归过程:
设当前串 是某个 ,我们已知 的前 字符与 一致(如果 )。是回文串,中心是某个字符 (由 的某个位置决定)。
是 进行翻转得到的,长度 。如果 ,那么我们只需检查 是否是 的前缀(且 是某个 )。
如果 ,那么 的前 个字符必须等于 ,并且 的剩余部分必须满足 的结构。这提示我们一个递归匹配算法:
从某个初始猜测的 开始,但我们可以反过来:给定 ,可以直接生成 的前缀,看是否与 匹配。
第五步:高效算法
观察:对于固定 , 的字符必须与 中某些位置匹配。
我们可以通过回文约束推导出 的字符。考虑 的结构:它总是关于中心对称的。
如果 是 的前缀,那么 的某些位置必须相等(回文性质)。我们可以枚举 ,对于每个 ,尝试用 来填充 的字符,检查是否存在一致的赋值。
具体做法(官方题解思路):
定义过程
check(n):- 令 的字符为未知变量 。
- 我们知道 是某个 的前缀。
初始 ,如果 ,则只需 是 的前缀,即 对 。
如果 ,则 的前 个字符必须等于 。 - 然后 长度 ,如果 ,那么 必须等于 的反转(回文对称部分)。
这会给出对 的更多约束。 - 如果还有超出,继续考虑 等,直到覆盖 的长度。
在推导过程中,如果出现矛盾(同一个位置应同时等于两个不同字符),则 不可行。
我们可以模拟这个推导过程,但不必显式生成整个串,而是用两个指针 表示当前 的匹配范围,并根据回文对称性添加约束。
第六步:实现方法
用并查集或直接数组记录每个位置的字符约束。
从 的第一位开始,逐步根据 的前缀匹配和回文对称性,推导 的其他位置的字符。如果推导完 的所有字符后没有矛盾,则 可行。
复杂度:对每个 ,推导过程 ,总 太慢。
但注意到 必须满足 是某个可能的初始长度,实际上 必须使得 满足“可以从前缀扩展成某个 ”的性质。
第七步:更快速的判定法
已知 是 的前缀,那么 本身必须是一个回文前缀链。
我们可以从 的末尾开始,利用回文对称性往前推导 。
具体做法(逆向推导):
- 假设我们有了 ,它的最后一步翻转中心是某个字符。
- 这个中心字符在 中对应位置是 ( 是某个值)。
- 那么 关于这个中心对称的部分必须相等。
我们可以枚举最后一次翻转的中心位置,然后向前回溯,看是否能回溯到某个长度 。
第八步:最终算法(KMP + 回文)
实际上,本题标准解法是:
- 预处理 的每个前缀是否是回文(可以用 Manacher 或哈希)。
- 定义 表示最大的 使得 经过若干次翻转可以得到 的前缀(即 是某个 且 是 的前缀)。
- 用类似 KMP 的方式递推 数组。
- 最终所有可能的 就是 链上的所有长度(包括 本身)。
第九步:样例解释
样例 1:
abcdcb- 可能长度 4:
abcd→abcdcba前 6 字符是abcdcb✅ - 可能长度 6:
abcdcb本身(0 次翻转)✅ - 输出
4 6
样例 2:
qwqwq- 长度 2:
qw→qwq→qwqwq✅ - 长度 3:
qwq→qwqwq✅ - 长度 4:
qwqw→qwqwqwq前 5 字符是qwqwq✅ - 长度 5:本身 ✅
- 输出
2 3 4 5
第十步:总结
本题核心:
- 翻转操作生成回文串。
- 是某个生成回文串的前缀,对 施加了回文约束。
- 通过回文链递推(KMP-like)找出所有可能的初始长度 。
复杂度 。
- 1
信息
- ID
- 5947
- 时间
- 12000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 11
- 已通过
- 1
- 上传者