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\)就好了
充要条件见题解,证明比较简单,与上面的证明差不多