动物园

这一道题就是求若干个候选项

一个很容易想到的办法就是倍增,但是需要卡常

可以看看洛谷的代代码(不是题解),这种方法可以\(O(1)\)实现转移,很巧合的一个东西

那个\(f\)就是形成的KMP树的节点的深度(相当于还能跳多少次next),原理就是利用上一个位置跳到的地方已经是小于等于\(\frac{l}{2}\)了,只要排除最特殊的情况就好了

严格证明一下:

这个做法利用了next数组一个很重要的性质,集合{\(next[i]-1,next[next[i]]-1,...\)}是集合{\(next[i-1],next[next[i-1]],...\)}的子集

对当前下标\(i\),如果\(i\)是偶数,那么我们需要考察集合{\(next[i]-1,next[next[i]]-1,...\)}中长度小于等于\(\frac{i}{2}\)的元素,也就是集合{\(next[i-1],next[next[i-1]],...\)}中长度小于等于\(\frac{i}{2}-1\)的元素,我们前面已经考虑了集合{\(next[i-1],next[next[i-1]],...\)}长度小于等于\(\frac{i-2}{2}\)的元素,易知两者一样,所以可以直接重复KMP的过程;如果\(i\)是奇数,那么我们需要考察集中{\(next[i]-1,next[next[i]]-1,...\)}中长度小于等于\(\frac{i-1}{2}\)的元素,也就是集合{\(next[i-1],next[next[i-1]],...\)}中长度小于等于\(\frac{i-1}{2}-1\)的元素,我们前面已经考虑了集合{\(next[i-1],next[next[i-1]],...\)}长度小于等于\(\frac{i-1}{2}\)的元素,只需要排除长度为\(\frac{i-1}{2}\)的元素即可

上面那个性质可以记住

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