当前位置: 首页 > news >正文

洛谷 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 的构造也需要想想,抓到很不是回文串的两种字符串即可。

http://www.zskr.cn/news/39018.html

相关文章:

  • linux报错
  • 高级语言程序设计作业3
  • P14359 [CSP-J 2025 T3] 异或和 ← 前缀异或和
  • 第14天(中等题 滑动窗口、哈希表)
  • Office 2024 专业增强版下载安装教程:安装/下载/激活/全流程教程
  • fhq treap笔记
  • 11/3
  • ICPC2025 武汉站 游记
  • 基于Blocking queue的生产消费模型
  • React中useContext的基本使用和原理解析
  • JDK的安装过程
  • File文件操作
  • 越南航空数据泄露事件深度解析
  • redux-thunk和createAsyncThunk
  • 【AI说Rust 01】Rust 的学习路线
  • P11771 题解
  • CSP-S 2025 饭堂寄
  • 如何在github上使用github免费域名下预览自己的项目
  • 在ROS中安装PX4依赖实现Gazebo仿真
  • Windows 路由表详解
  • 如何启用cycloneDDS的iceoryx
  • 老化车
  • 在Fiddler中模拟网络中断,返回500错误的过程
  • 构建企业级AI提示词攻击防御体系的实战指南-2025年
  • 矩阵的秩
  • Python列表推导式完全指南
  • 如何启用cycloneDDS的iceoryx共享内存?(转载)
  • Rockchip RK3588 - Mali-G610 GPU驱动(mesa+Panthor)
  • auto
  • 写给创业者新手:什么是MAU指标,什么是ARR、PMF