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

CF700E

题目大意:

给定一个长为 \(n\) 的字符串 \(S\),你要找到最大的 \(k\),使得存在 \(s_{1} \sim s_{k}\) 使得 \(s_{1}\)\(S\) 子串 且 \(s_{i}\)\(s_{i - 1}\) 中作为子串至少出现两次。
\(n \le 2 \times 10^5\)

解题思路:

考虑至少出现两次的条件是不好做的,但是我们贪心地倒推 \(s_{i}\)\(s_{i - 1}\) 的关系,由于 \(s_{i - 1}\) 越小越好,所以最后一定会让 \(s_{i}\) 变成 \(s_{i - 1}\) 的 border。
但是我们发现沿着这条路是不好走的,因为要求 \(s\) 内每一个字串最多跳多少次 border。

对于字符串的题,我们可以套路地设 \(dp_{i}\) 表示以 \(i\) 为后缀的答案,要求 \(s_{1}\)\(i\) 开头。
因为我们发现对于 border 是不断缩小的,而且无后效性。

那么为了转移,我们肯定要再设一个 \(len_{i}\) 表示 \(k\) 最大的情况下 \(s_{1}\) 最小是多少。

但是考虑直接转移是不对的,因为 \(dp\) 值大但可能转移不到后面,而且我们必须设一个状态数线性的 dp,不然会直接爆掉。
我们尝试一下能不能修锅。

考虑先把 \(dp\) 值算出来,因为每个 \(dp\) 能更新的在 SA 上是一段区间,所以能 \(O(n \log n)\)

现在的问题是对于两个位置 \(j,k\)\(j\)\(len_{j}\) 不能直接更新 \(len_{i}\),但 \(len_{k}\) 可以,而我们又要求的是最小的,所以希望取 \(len_{j}\) 的前缀。

由于 \(k \sim k + len_{k} - 1\) 是以 \(i\) 为开头的后缀的前缀,所以 \(i \sim i + len_{i} - 1\) 等于 \(k \sim k + len_{k} - 1\)
也就是我们只需要找到 \(LCP(i,j) >= len_{k}\) 的最前面的位置就行了。

\(len_{k}\) 就找到最小的即可。

O(n \log n)。

http://www.hskmm.com/?act=detail&tid=25323

相关文章:

  • 价值弥漫:“AI元人文”的场域革命与共生之路
  • k8s之pod概念
  • CF 1055 Div.1+Div.2
  • 2026 NOI 做题记录(五)
  • ARC 207 (Div.1)
  • “齐俊杰投资智能体”更新完了9月份的资料
  • LVS+Keepalived高可用群集 - 指南
  • luogu P1020 [NOIP 1999 提高组] 导弹拦截
  • RabbitMQ 离线安装
  • Nginx 离线安装
  • docker 离线安装
  • uniapp 转回tabbar页面
  • 第十一届中国大学生程序设计竞赛网络预选赛 魔塔
  • JDK 离线安装
  • minio 离线安装
  • HbuilderX 将 h5转成uniapp的一些记录.19127294
  • 银行同业存单产品的筛选方法
  • deepseek 私有部署文档
  • MySQL运维及开发规范
  • 短视频平台差异视角下开源AI智能名片链动2+1模式S2B2C商城小代码的适配性研究——以抖音与快手为例
  • 异步读写mysql依赖pymysql (asyncio/ aiomysql)
  • Linux发行版切换技术全解析
  • 手把手教你用 Docker 部署 Redis
  • 悟空博弈单元(WBUC)与广域统一计算(WAUC)研究:价值共生的技术基石——声明Ai研究
  • 掌握形式验证工具,提升芯片验证效率
  • 长租公寓的生存越来越难了 - 智慧园区
  • Spring Boot中保存前端上传的图片 - 教程
  • P2724 [IOI 1998 / USACO3.1] 联系 Contact 做题笔记
  • 深入解析:Linux运维笔记:服务器感染 netools 病毒案例
  • 设计模式——命令设计模式(行为型) - 详解