【学习笔记】[JSOI2019]节日庆典
我觉得很厉害。因为这道字符串题目的分析非常自然而且并不复杂。
考虑枚举右端点到 r r r时,维护可能成为答案的位置的集合。显然对于相邻两个元素 i , j i,j i,j,我们有 lcp(S[i:],S[j:]) > r − j \text{lcp(S[i:],S[j:])}>r-j lcp(S[i:],S[j:])>r−j,否则可以删去 i , j i,j i,j其中之一。画图不难发现我们只需要保证对于任意 k k k,满足 lcp(S[i:],S[k:]) > r − k \text{lcp(S[i:],S[k:])}>r-k lcp(S[i:],S[k:])>r−k,也就是只用和第一个位置进行比对。注意 lcp \text{lcp} lcp的长度是不随右端点 r r r变化的,可以看成常数。
当然,上述分析并不能导向一个正确的解法。假设我们已经维护出来了上述集合,有一个非常套路的想法,假设已经检查完了 i i i之前的所有位置,那么对于之后的一个位置 j j j,假设 j − i < r − j j-i<r-j j−i<r−j,那么不难发现 S [ i : j ) = S [ j : 2 j − i ) S[i:j)=S[j:2j-i) S[i:j)=S[j:2j−i),我们记这一段为 A A A(更确切地说 A A A是 S [ i : r ] S[i:r] S[i:r]的周期), 2 j − i 2j-i 2j−i以后的为 B B B,那么我们得到 A + A + B , A + B + A , B + A + A A+A+B,A+B+A,B+A+A A+A+B,A+B+A,B+A+A三种方案。容易观察出中间那种肯定是不优的,也就是 j j j一定不优。那么有 2 j ≥ r + i 2j\ge r+i 2j≥r+i,显然只有最多 log \log log个需要检查,这道题就做完了。因为 lcp \text{lcp} lcp已经匹配到了底所以用 z z z函数辅助检查一下即可。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
代码咕了。其实是我不会打
z
z
z函数
至于维护集合那个部分,可以自己编一个做法,事实上发现每次暴力重构就完了。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17529996.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-04-15 【题解】火枪打怪