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

QOJ 10499 [PA 2016 Final A] Dopasowanie

自己做出来了个单 \(k\) 的做法😎,有点厉害,记一下。

首先有一个最朴素的 dp,即记 \(f(i, j)\) 表示 \(s\) 的子串匹配到 \(i\)\(t\) 匹配了 \([1, j]\) 的最小花费,那么转移直接分讨:

  • 删除 \(t_{j + 1}\)\(f(i, j) + 1 \to f(i, j + 1)\)
  • 插入 \(s_{i + 1}\)\(f(i, j) + 1\to f(i + 1, j)\)
  • 匹配 \(s_{i + 1}, t_{j + 1}\)\(f(i, j) + [s_{i + 1} \not = t_{j + 1}] \to f(i + 1, j + 1)\)

那么若存在 \(f(i, |t|) \le k\),就说明可以以 \(r\) 为右端点,不过左端点并不清楚。

不过问题并不大,考虑让 \(\operatorname{rev}(s_{1\sim r})\)\(\operatorname{rev}(t)\) 再做一次上述的 dp,并强制 \((0, 0)\) 为起点即可(上述做法起点可以为任意 \((i, 0)\))。

于是这就得到了一个 \(\mathcal{O}(|s||t|)\) 的做法。

不过因为 \(k\) 很小,所以只有 \(f(i, j)\le k\) 的状态才是有用的。
于是有一个想法就是把状态设计成 \(g(i, k')\) 表示 \(f(i, j)\le k'\)\(j\) 的集合,但是会发现 \(f(i, j)\) 没有单调性,就只能 bitset 做了。

此时考虑从一个 01bfs 的思想来找到结构。
具体来说,考虑根据 \(k'\) 来扩张,首先扩张出 \(f(i, j)\le k' = 0\)\((i, j)\),然后不断尝试 \(k'\gets k' + 1\),观察扩张 \(f(i, j)\) 的过程。

首先发现对于 \(k' = 0\),因为只有斜向边权可能为 \(0\),此时扩张出来的一定满足对于每个 \(0\le i\le |s|\)\((i + x, j + x)\) 的一段前缀,也就是一个斜线。
然后发现 \(k'\gets k' + 1\) 后,会使每一段斜线往上平移 \(1\) 单位,往右平移 \(1\) 单位,然后向右上平移 \(1\) 个单位,平移后每一个 \((x, y)\) 会尝试向 \((x + 1, y + 1)\) 扩张(当斜向边权为 \(0\) 时)。

于是会发现,对于任意 \(k'\),考虑对于 \(i\in [0, |s|]\),满足 \(f(i + x, x)\le k'\)\(x\) 始终是一个前缀。不过这个时候还有 \(f(i, j)(i > j)\) 的情况,此时考虑把 \(i\) 扩展到负半轴,令 \(f(i + x, x) = x(i + x \le 0)\) 也满足以上条件。

于是考虑设 \(g(i, k')\) 表示满足 \(f(i + x, x)\le k'\) 最大的 \(x\)
转移就是 \(g(i, k') \gets \max(g(i - 1, k' - 1), g(i, k' - 1) + 1, g(i + 1, k' - 1) + 1)\),然后若 \(s_{i + g(i, k') + 1} = t_{g(i, k') + 1}\) 就继续扩张。

只需要快速做扩张的操作,会发现这就相当于是求 \(\operatorname{lcp}(s_{i + g(i, k') + 1\sim |s|}, t_{g(i, k') + 1\sim |t|})\)

用 hash 二分可以做到 \(\mathcal{O}(|t| + (|s| + k)k \log \max(|s|, |t|))\)
用后缀数组就可以做到 \(\mathcal{O}((|s| + |t|)\log (|s| + |t|) + (|s| + k)k)\)

代码写的 hash 二分,挺好写的。

submission。

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

相关文章:

  • 《突破边界!Power BI在大数据网络分析中的应用》
  • 宿舍管理系统(付源码 Fastapi+vue2)
  • AntiGravity Ralph Wiggum 风格
  • Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
  • 再互动剖析脉动如何用“一物一码”hold住年轻市场?
  • 开题报告 微信小程序 老年人健康老友上门服务
  • 【保姆级教程】手把手教你安装OpenClaw并接入飞书,让AI在聊天软件里帮你干活
  • 长线LP集结入场,耐心资本重塑科创创投新生态
  • 1.31 servlet生命周期
  • 卧槽,Sora2全线崩溃?!你的API是不是又挂了?别慌,这是技术指南
  • Docker 镜像仓库运行分析报告
  • 人工智能驱动下的智能制造:产业升级的引擎 - 实践
  • 接口请求失败重试的8 种方案,稳妥极了!
  • 同步时钟强大的系统解决方案提高工作效率和协同性
  • 苍穹外卖之SpringCache在项目中的应用场景
  • 重组 IgG 抗体:基因工程赋能的定制化抗体,精准适配生物研发与药物开发
  • 在移民体检方面,有哪些能提供专业靠谱、高端且有领馆认证服务的推荐
  • 英国移民体检心得:为什么我推荐百汇新天地医疗?
  • 阿里不推荐使用 keySet() 遍历HashMap?是有原因的
  • SpringBoot 这么实现动态数据源切换,就很丝滑!
  • 2026fall英国留学办理签证的流程,去英国留学签证在哪里办
  • 苍穹外卖之SpringMVC的消息转换器在项目中的应用场景
  • 不想写大量 if 判断?试试用规则执行器优化,就很丝滑!
  • Redis快速实现布隆过滤器
  • 完整教程:蓝牙智能硬件常见报错处理(连接失败、数据丢包、设备搜索不到)
  • Godot开发问题记录:无法为节点拖拽添加脚本(godot显示禁止图标)
  • 深度硬核|.xr勒索病毒逆向分析与数据救援实战指南(附IOCs排查脚本)
  • 金融风控系统中的实时数据库技术实践
  • 广州PHP开发服务选择指南:如何寻找靠谱的技术合作伙伴
  • 巴菲特的创新能力评估:分布式创新网络的价值创造