容易发现 LLL 是可以二分的。
接着考虑二分如何 check。
check
比较容易思考的思路是 DP,设 fif_ifi 表示前 iii 个字符的熟悉子串最长的长度之和。设当前二分的是 LLL,那么 fi=max{fi−1,maxj∈[i−maxleni,i−L]fj+(i−j)}f_i = \max\{f_{i-1},\max \limits_{j \in [i - maxlen_i,i-L] } f_j + (i-j)\}fi=max{fi−1,j∈[i−maxleni,i−L]maxfj+(i−j)}。其中 maxlenimaxlen_imaxleni 表示以 iii 结尾的最长的在字符串中出现过的字符串的长度。
也就是说,我们可以枚举每一个 jjj 进行转移,因为有 [i−maxleni,i−L][i - maxlen_i,i-L][i−maxleni,i−L] 的限制,每个从 j+1j+1j+1 到 iii 的字符串一定是在标准作文库中出现过的,转移即可。
maxlenimaxlen_imaxleni 可以建出 SAM 后用求最长公共子串的做法维护。
可以获得一个 O(mn2logn)O(m n^2\log n)O(mn2logn) 的做法。
容易发现 DP 有决策单调性,单调队列维护即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现