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

NOIP2020 T2

给定长度为 \(n(1 \le n \le 2^{20})\) 的字符串 \(s\),问有多少种合法的拆分方式?一种合法的拆分方式:

  • \(s = (AB)^iC(i > 0)\)其中 \(A,B,C\) 为非空字符串,\((AB)^i\)\(i\)\(AB\) 拼接的结果。
  • \(F(A) \le F(B)\) \(F(s)\) 表示 \(s\) 中出现奇数次的字符数。

先忽略第二个条件。显然可以把 \(AB\) 看成一个整体(题目给了很强的提示),枚举 \(AB\) 的长度 \(len\),用 hash 判断每个 \(i\) 是否可行。

由调和级数可知,至多由 \(n \log n\)\(i\)。每个 \(i\)\(len - 1\) 种选法。

接下来考虑第二个条件,可以预处理出 \(s\) 有段后缀的 \(F_i\) ,然后将长度为 \(1 \sim len - 1\)\(F\) 丢到数组里(表示 \(A\) 的选法),查询 \(F_{i\cdot len + 1}\) 对应的贡献即可。

因为 \(F \le 26\),直接暴力加贡献即可。(否则还要个树状数组,时间复杂度是 \(O( n\log n\log26)\))。

时间复杂度:\(O(n (\log n + 26))\)

注意下常数能过,似乎有 \(O(n)\) 的扩展 KMP 做法。

http://www.jsqmd.com/news/15602/

相关文章:

  • Alex-VGG3
  • 第二章日志分析-redis应急响应
  • 第一章 应急响应- Linux入侵排查
  • 浏览器多开的方法
  • 10月17号
  • 第一章日志分析-mysql应急响
  • 超好用的浏览器多开小工具!轻松管理多个账号,可以无限制使用其他插件
  • 微服务组件-Eureka 科技详解
  • 微服务组件-Eureka 科技详解
  • python-IDLE定制界面大小
  • 新学期每日总结(第10天)
  • List.subList() 返回值为什么不能强转成 ArrayList
  • 奶奶都能看懂的 C++ —— 手把手指针
  • 10/17
  • CSP-2024 T4
  • NOIP2021 T2
  • 洛谷 P8512
  • 【题解】成外友谊赛
  • 小程序商城客服系统
  • ubuntu 主机创建虚拟 ip,应对容器内部配置了宿主固定 ip,宿主迁移网络环境后容器报错
  • 2025权威报告:微信编辑器排版Top 10工具推荐(全链路解决方案)
  • 洛谷 P10149
  • 从0到1构建企业数据资产 - 智慧园区
  • 2025.10.17
  • 一行代码清空所有 docker 容器的日志文件
  • 塔吊施工 “隐形风险” 克星!思通数科 AI 卫士精准识别核心部件隐患
  • ubuntu配置vsftpd
  • 时序数据库 Apache IoTDB 等你“打卡”!2025 OSCAR 开源产业大会完整版议程揭晓
  • 2024 CCPC Final F
  • Windows关闭端口占用