SZA-Template

这篇题解

解释一下:

对于\(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\)就好了

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

posted @ 2024-01-24 17:28  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报