看这篇题解
解释一下:
对于f[i]来说,如果next[i]为0,那么f[i]=i,否则的话,答案只有可能是集合{next[i],next[next[i]],...}中的一个元素,设这个集合为S
引理:如果一个模式串可以覆盖i,那么这个模式串就可以覆盖next[i]
证:如下图
绿色的表示模式串,我们将图中第二个绿色模式串去掉,再在i−next[i]处加上一个绿色模式串(如下图),就可以得到一个next[i]的覆盖
证毕
于是可以知道,集合S中小于f[next[i]]的元素都不可能成为答案(因为如果是答案的话,就能覆盖i,当然也就能覆盖next[i],与f[next[i]]的最小性矛盾),而大于f[next[i]]的元素如果能覆盖i的话,那么f[next[i]]一定也能覆盖i(设这个元素为p,f[next[i]]能覆盖i,就能覆盖next[i],就能覆盖next[next[i]],...,就能覆盖p,所以p对i的覆盖就能替换为f[next[i]]对i的覆盖),所以我们只用考虑f[next[i]]能否覆盖i就好了
充要条件见题解,证明比较简单,与上面的证明差不多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构