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

bitset 优化求解 LCS

https://loj.ac/p/6564

题意:求两个字符串的最长公共子序列,串长、字符集 \(\le 7\times10^4\)

分析

我们知道,求 LCS 的经典方法是 DP,状态已经是 \(O(n^2)\) 级别,而且无法省掉状态。但是,我们可以发现,对所有 \(i,j\) 都有 \(f_{i,j+1}-f_{i,j}\le 1\),由此可以发现 \(f_i\) 的差分是 01 序列,考虑 bitset 优化,分析一下转移式子 \(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1}+[s_i=t_j])\),(从下面开始 \(f\) 代表着 DP 数组的差分)现在在 \(j\) 处出现了 \(i,j\) 之间的匹配,那么从 \(j\) 往后扫,只要扫不到 1,那么 \(f_{i,j}\) 最优一定取在 \(f_{i,j-1}\),对于扫到的第一个 1 也是如此,但该 1 往后便不再如此。即使这里面出现了更多能匹配的位置,\(f_{i-1,j-1}+1\) 的取值也只是和 \(f_{i,j-1}\) 相等,所以没有影响。

总结一下,我们要做的操作是:将其划分为若干段 00...01 序列,对每一段序列,找到其中出现的最早的能匹配的位置,将该位置设为 1,然后将最后一个 1 设为 0。对于最后面的一段全 0 序列,也如此做,但没有将最后一个 1 设为 0 的环节。

考虑这玩意怎么用 bitset 优化。常规的那些操作显然没啥效果,设 \(g_i\) 表示字符 \(i\) 的取值下标,注意到如果我们将 \(f_{i-1}\)\(g_{s_i}\) 或起来得到 \(h\),那么对于每一段划分出来的序列,相当于取序列的 lowbit,而取 lowbit 有一个做法是 \((x\oplus (x-1))\& x\),套用这个做法,我们想要对每一段序列都减 1。发现 \(f_{i-1}\) 有一个性质是每一段的最后一位都为 1,那么把这个 1 通过右移移到下一个序列中,第一个序列手动在开头创造一个 1,然后让 \(h\) 减掉这个东西就能顺利套用了。

时间复杂度 \(O(\frac{n^2}{\omega}\))。

http://www.sczhlp.com/news/31282/

相关文章:

  • 牙膏的网站建设凡科建站怎么建网站
  • 秦皇岛在线seo168小视频
  • 莱芜金点子信息港二手房seo公司哪家好
  • 网站建设经费预算表百度如何购买关键词
  • 论坛静态网站源码旺道seo软件
  • 8.23-carbon-assets模块错误记录
  • 网站直播是未开票收入怎么做广告投放公司
  • 中文wordpress企业高端网站优化公司
  • 南通网站建设淘宝推广软件
  • 网站搜索功能怎么做中国新闻发布
  • 腾讯大浙网 网站开发珠海seo关键词排名
  • 怎么做虚拟币网站郑州网站推广公司
  • 河南专业网站建设创新中心想做一个网站
  • html5 手机网站 模板百度指数排行榜哪里看
  • 华为做网站bt磁力天堂torrentkitty
  • pyyzDay18
  • 北京怎么做网站谈谈对seo的理解
  • 深圳做公司网站的公司营销型网站的分类
  • 网站建设运营合同北京seo怎么优化
  • 设计感强的网站自动发外链工具
  • 注册公司没有场地怎么办英文谷歌seo
  • 网站四站合一网站建设图片
  • 广告宣传片制作公司厦门seo关键词
  • 广州百度推广优化排名seo搜索引擎优化入门
  • wordpress侧边栏 菜单系统优化的意义
  • 网站建设接单交换链接营销
  • Kylian Mbappe
  • 选择性检索增强代码库级补全技术
  • 日照seo公司关键词优化推广公司哪家好
  • 使用Echidna进行智能合约库测试的完整指南