CF1393E1/2
description
给定
solution
设
有转移:
其中
这么做的状态数是
转移可以外层枚举
当
如果
如果
图中的
这么做固定了
考虑如何做 harder version。
打表发现按照上面的顺序转移没什么规律,转移过来的位置也比较乱。
思考一会儿可以发现,对于所有
这样就可以把所有这些串排序,然后维护指针,其前方的字符串都比当前串非严格地小,从前面那些 dp 值转移就好了。
理一下思路,现在有两个问题:给一个字符串的所有删去一个字符的串(和它自己)排序;以及快速询问输入的两个相邻的字符串各自删去不超过一个字符后剩下字符串的字典序大小关系。
part 1.
考虑第一个问题。
它等同于SNOI2019 字符串。
问题就是给定字符串
考虑像上面 easier version 处理删去字符导致的偏移的情况的方法。预处理每个位置
一个可行的排序方式:
... sort(now.begin(),now.end(),[&](const int x,const int y)->bool{ int a=min(x,y),b=max(x,y); if(a==-1){ return (x>y)^(s[nxt[b]-1]<s[nxt[b]]); } if(nxt[a]>b) return x<y; return (x>y)^(s[nxt[a]]<s[nxt[a]-1]); }); ...
时间复杂度
对于原问题,把每个串都这样排序,时间复杂度
part 2.
再考虑第二个问题。
快速询问两个相邻字符串各删去不超过一个字符后剩下的字符串的字典序。
相当于分成三段比较,从前到后每一段分别二分失配位置就行了,比较两个子串是否相等可以使用字符串哈希。单次询问是
理论上这题就做完了,时间复杂度
但是第二个问题中二分的过程细节很多,有不少边界情况要处理。
这里建议:
-
给输入的串末尾都插入两个 ASCII 值小于
a
的字符,防止越界。 -
第二个问题先用暴力实现,可以轻松跑过 easier version,确认第一个问题没有写挂之后再写二分。
-
对于不删字符的情况,转化为删去末尾人为添加的倒数第二个特殊字符。
-
仔细检查是否越界,不然会有玄学错误,建议多 assert。
-
此题不卡哈希,自然溢出可过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?