SZA-Template

这篇题解

解释一下:

对于f[i]来说,如果next[i]0,那么f[i]=i,否则的话,答案只有可能是集合{next[i],next[next[i]],...}中的一个元素,设这个集合为S

引理:如果一个模式串可以覆盖i,那么这个模式串就可以覆盖next[i]

证:如下图

绿色的表示模式串,我们将图中第二个绿色模式串去掉,再在inext[i]处加上一个绿色模式串(如下图),就可以得到一个next[i]的覆盖

证毕

于是可以知道,集合S中小于f[next[i]]的元素都不可能成为答案(因为如果是答案的话,就能覆盖i,当然也就能覆盖next[i],与f[next[i]]的最小性矛盾),而大于f[next[i]]的元素如果能覆盖i的话,那么f[next[i]]一定也能覆盖i(设这个元素为pf[next[i]]能覆盖i,就能覆盖next[i],就能覆盖next[next[i]],...,就能覆盖p,所以pi的覆盖就能替换为f[next[i]]i的覆盖),所以我们只用考虑f[next[i]]能否覆盖i就好了

充要条件见题解,证明比较简单,与上面的证明差不多

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示