UOJ700 2022候选队胡策 可爱多的字符串
一个 UOJ 博客的同步存档。
对字符串按 分块,对于一组询问 ,如果其长度小于 暴力,否则找到这一段覆盖到的第一个块端点 ,有 。先跑出 的答案,这可以离线后对每个块端点跑一次 kmp,然后分开计算长度小于等于 和大于 的前缀 border 的贡献。
长度小于等于 的部分暴力枚举 border 长度 ,则需要计算的是 上所有 的 endpos 的贡献和。放在 SAM 上这东西就是一个二维偏序,询问定位可以在 SAM 的 DAG 上跑所以是 ,将所有询问离线下来扫描线,用 修改 询问的数据结构维护即可做到 。因为空间限制比较紧不能直接存 个询问,所以需要一点小技巧将空间优化到线性,留给读者自行思考。
某个蠢人场上二维偏序写了 然后想了一万年怎么优化我不说是谁
长度大于 的 border 则可以利用 的信息,这是因为如果 有一个 border 长度为 ,则 一定对应有一个长度为 的 border。所以 的长度大于 的 border 的贡献和一定是在 答案的基础上减掉一些 有但 就没有的 border 的贡献。
具体地,考虑一个点 ,则其在 中的贡献是 ,而这个贡献能够出现在 中的充要条件是 。所以将 调到 的贡献变化是 。
对于一个确定的 ,lcp 与 lcs 的其中一个参数是确定的,所以算 lcp 可以每次算一遍扩展 kmp,算 lcs 可以在 SAM 的 parent 树上打差分标记然后 dfs 做个路径和,都是 的。 这东西的计算又是一个二维偏序。按照 扫描线,以 作为下标存贡献就行, 里面的元素产生变化时进行一下调整。乍一看还是要带 ,但是 所以 可以跟 取 ,所以不用数据结构暴力维护长度为 的数组然后每次暴力算前缀和就行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】