CF1120C Compress String 题解
简要题意:你需要打出一个长度为 的字符串 。
- 花费 的代价,在末尾打出一个字符。
- 花费 的代价,在末尾打出目前已打出字符串的某个子串。
问最少的操作代价,。
不妨用 表示操作前 个数的最小代价。可以在枚举当前点 时再枚举一个之前点 。如果 就进行一次转移。暴力去判断子串相等就是 的复杂度。
可以配合 ,还要线段树维护 set
。第 个 set
储存 的 值,查询相当于在一段前缀 set
中查询一个元素是否存在。不过这样又要用线段树又需要 set
,复杂度 ,就算使用 unordered_set
还得承受大常数 。
发现不管怎么做,询问的东西都是一样的,先预处理出所有询问,按照每个询问的 排序。这样每次询问都在一段前缀中进行。排序询问的复杂度是 ,后续查询采用 unordered_set
,复杂度 。总复杂度为 。
也可以维护原串的最长公共后缀,由于 具有单调性(假如 必然是操作 使得这种情况发生,那我操作 少粘贴一个字母就能使得 ,也就是说假设必然不成立, 具有单调性,),每次应该从最小的 转移过来,这个最小的 就是之前某个 与 的最大公共后缀。复杂度 。
在这个做法的基础上,在后缀自动机上跑双指针( 和 ), 存在就转移,否则 右移。复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?