洛谷 P11190

给定长度为 \(n\) 的字符串 \(s\),问至多能将 \(s\) 划分成多少个子序列,使得每个子序列都不是回文串?(输出方案)

特殊性质 A:每个字符出现次数不超过 \(\frac{n}{2}\)

特殊性质 B:只有 a, b 两种字符。

这个题没有特殊性质提示感觉有紫。

特殊性质 A

没有绝对众数,所以可以尝试把两个不同的字符丢到一个回文串,答案为 \(\lfloor \frac{n}{2} \rfloor\)

构造有个经典 trick,将 \(s\) 重排,颜色相同的丢一起,然后 \((i, i + n / 2)\) 形成一个子序列。\(n\) 是奇数丢到 \((1, 1 + n / 2)\) 里即可。

特殊性质 B

不妨设 a, b 中多的为 a,其数量 \(c_a\) 达到了 \(\lfloor \frac{n}{2} \rfloor\)

显然每个字符串里都要有 b,所以答案至多 \(c_b\)

考虑如何达到这个上界,有两种显然不是回文串的字符串 aa...abbaa...a。设 b 的出现位置是 \(p_1, p_2, \dots p_{c_b}\)

  • 对于 \(1 < i < c_b\)\(p_{i - 1} + 1 \sim p_i\) 组成一个子序列。
  • 对于 \(i = 1\),让 \(p_1, p_{c_b - 2} + 1 \sim p_{cb - 1} - 1, p_{cb - 1} + 1 \sim n\) 组成一个子序列。
  • 对于 \(i = c_b\),让 \(1 \sim p_1 - 1, p_{c_b}\) 组成一个子序列。

这样构造能使得每个字符串都是前面的两种形式。对于那些只有一个字符 b 的子序列,从别的子序列挪一个 a 形成 abba

正解

把两部分结合起来,如果有绝对众数,把绝对众数视为 a,剩下的视为 b,做特殊性质 B。否则特殊性质 A。

时间复杂度:\(O(n)\)


这个题特殊性质有较强的引导意义,特殊性质 A 的 trick 值得学一下。这种分是否有绝对众数讨论的思想值得学习。

性质 B 的构造也需要想想,抓到很不是回文串的两种字符串即可。

posted @ 2025-11-03 22:17  xiehanrui0817  阅读(10)  评论(0)    收藏  举报