BZOJ 3796 Mushroom追妹纸 题解

news/2024/12/31 1:25:56/文章来源:https://www.cnblogs.com/laijinyi/p/18403594

Statement

\(s_1,s_2,s_3\),求最长的 \(w\) 的长度,满足

  • \(w\)\(s_1\) 子串
  • \(w\)\(s_2\) 子串
  • \(s_3\) 不是 \(w\) 子串

Solution 1

以下是我没看题解瞎胡的

首先一个弱智想法是,枚举 \(s_1\)\(w\) 的左端点,二分右端点,判定时 \(s_2\) 用 SAM,\(s_3\) 用单串 AC 自动机 / KMP。虽然复杂度不对,但是加点乱搞就能过。

然后优化,考虑在 \(s_1\) 上双指针,如何 \(O(1)\) 判定加入一个点时 \(s_3\) 是不是 \(w\) 子串?用 height 那一套求反串 lcp 即可。


Solution 2

以下是我看别的做法,转述的,不保熟

首先若没有 \(s_3\),这是经典的“多串求最长公共子串”问题,有这样两种做法:

  • 二分答案 \(x\),因为 \(\min_{l\le i\le r}\text{height}(i)\le x\),若一段极长满足 \(\text{height}(i)\le x\)\(l,r\) 中同时出现 \(s_1,s_2\) 的后缀就可以。
  • 因为 \(Ans=\max_{1\le l\le r\le \text{len}}\left\{\min_{p=l+1}^r\{|\text{lcp}(p,p-1)|\} \right\}\),其中 \(l,r\) 中同时出现 \(s_1,s_2\) 的后缀,故双指针 \(l,r\),单调队列维护 \(\text{height}\) 最小值即可。(或 \(O(1)\) 查,带预处理 log)

\(T=s_1+\texttt{\#}+s_2\),用 KMP 处理出 \(s_3\)\(T\) 中的所有出现

这时用第一种方法的话,再要求区间内没有完整出现 \(s_3\) 就行。一种方法是,若 \(s_3\)\(T\) 中出现的一个起始位置为 \(x\),那么改一下 \(\text{height}\),要求 \(\text{height}(\text{rk}(x-i))<|s_3|+i\),把这些要求 \(O(n)\) 并起来就行。

另一种方法是,设 \(f(i)\)\(T\) 的后缀 \(i\) 不包含 \(s_3\) 的最长前缀长度,把 ans = max(ans, height[i]) 改成 ans = max(ans, min({height[i], f[sa[i - 1]], f[sa[i]]})) 就行了。

另另一种方法是,直接用个数据结构维护。

用第二种方法的话,一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何把网页的公式优雅地拷贝到word中:数学公式识别神器—Mathpix Snip

这个编辑器其实在把chatgpt的公式粘贴到word中时就已经使用了,用的是网页版。 现在下载了软件(但是好像一个月试用期过后得收费?但是就目前来说,体验感真的超级好) 把公式复制粘贴转成mathtype公式 可以截取电脑屏幕上的图像,如果图像上面有公式的话,就会识别,之后可以…

Redis 入门 - 图形化管理工具如何选择,最全分类

Redis图形化管理工具可分为四类:命令行工具、桌面客户端工具、网页工具、插件工具。看看哪一款适合你呢?工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍。 Redis图形化管理工具五花八门,可供选择的很多,大…

Javaweb-事务

注意在当前窗口是修改了的:而在其他窗口是不修改的:select @@autocommit;修改为手动提交:

格路计数

前言 完全借鉴于 洛谷日报 前提条件 在一个网格图上, 每一次可以从 \((x,y)\) 走到 \((x+1,y-1)\) 或者 \((x+1,y-1)\) 限制是一条直线 \(y=k\) 题外话 我们其实可以发现这和每一次可以从 \((x,y)\) 走到 \((x+1,y)\) 或者 \((x, y+1)\) 限制是一条 \(45\)的斜线 \(y=x+k\) 是等…

9.2-9.8 总结

zhicheng123456做题 因为联考众多,所以说只有不多的做题。主要得知了两个结论:找树剖到根的轻链(动态)的方法和把线段(均匀随机分界点)分为 \(n\) 段的 \(k\) 短值的计算。 联考:https://www.cnblogs.com/british-union/p/liankao.html 还是时常在简单的东西上失败,但是…

第一章预习作业

第一周预习报告 学习内容《WindowsC/C++加密解密实战》第1,2章 第一章概念复习 第二章主要在Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上),如果默认不是,参考下面脚本。 AI对学习内容的总结 要求 让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可使…

9月第一周漏洞学习

蜂信物联(FastBee)物联网平台download存在任意文件下载漏洞 漏洞描述 FastBee是一款开源物联网平台,致力于为全球开发者提供稳定、搞笑的物联网解决方案。FastBee在download接口中存在任意文件下载漏洞,可能导致敏感信息泄露、数据盗窃及其他安全风险,从而对系统和用户造成…

AtCoder Beginner Contest 252 A~G 题解

前言这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持!A - ASCII code 题目大意 给定正整数\(N\),输出ASCII码是\(N\)的字母。 \(97\le N\le 122\) 输入格式 \(N\) 输出格式 输出ASCII码是\(N\)的字母。 分析 注意…

苯乙烯

周线 日线: 60分钟: 短线看能否走出下跌五浪吧:观望

AtCoder Beginner Contest 205 A~E 题解

A - kcal 题目大意 我们有一种每\(100\)毫升含有\(A\)千卡热量的饮料。\(B\)毫升的这种饮料含有多少千卡热量? \(0\le A, B\le 1000\) 输入格式 \(A~B\) 输出格式 输出\(B\)毫升这种饮料包含的的千卡数。最大允许浮点数精度误差\(10^{-6}\)。 样例\(A\) \(B\) 输出\(45\) \(20…

AtCoder Beginner Contest 196 A~E 题解

A - Difference Max 题目大意 给定四个整数\(a,b,c\)和\(d\)。 我们要选择两个整数\(x\)和\(y\)(\(a\le x\le b\);\(c\le y\le d\))。输出最大的\(x-y\)。 \(-100\le a\le b\le 100\) \(-100\le c\le d\le 100\) 输入格式 \(a~~b\) \(c~~d\) 输出格式 输出最大的\(x-y\)。 样…

AtCoder Beginner Contest 173 A~D 题解

A - Payment 题目大意 如果使用价值\(1000\)元的纸币(假设有)支付\(N\)元,服务员会找多少钱? \(1\le N\le 10000\) 输入格式 \(N\) 输出格式 一行,即服务员找的钱数。 样例输入 输出1900 1003000 0分析 特判: 如果\(N\)除以\(1000\)能整除,那么不需要找钱,输出\(0\); …