给定长度为 \(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...ab 及 baa...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 形成 ab 或 ba。
正解
把两部分结合起来,如果有绝对众数,把绝对众数视为 a,剩下的视为 b,做特殊性质 B。否则特殊性质 A。
时间复杂度:\(O(n)\)。
这个题特殊性质有较强的引导意义,特殊性质 A 的 trick 值得学一下。这种分是否有绝对众数讨论的思想值得学习。
性质 B 的构造也需要想想,抓到很不是回文串的两种字符串即可。