模板错误总结

一、LCT

splay的时候要先对x一次pushdown,不然的话x的左右儿子指针有可能是反的,rotate的时候x的父亲的另一个儿子就可能赋值成x的错误的一个儿子,导致树的关系被破坏甚至成环,因此死循环超时。

总结LCT或者伸展树中需要更新信息的地方:

rotate最后要上传y。

splay最开始下放x,循环中下放x的祖父和x的父亲,最后上传x。

找前驱、后继、第k大的时候走到一个点pushdown一次。

access合并子树的时候要上传。

link不用传标记。cut需要上传一次。

LCT只维护连通信息的时候可省去所以上传,但下放rev标记不能省。


二、后缀数组

二分的时候check函数有点问题。height[i]表示的是排名为i和i-1的lcp,因此如果height[i]>=x实际上是suffix(sa[i])和suffix(sa[i-1])可以匹配x位以上,计算的时候要把sa[i-1]纳入进来。只考虑sa[i]的话肯定是有问题的,假如说只有一个height[i]>=x,但是本来又是合法的,这样就会少考虑了一个后缀,相当于只考虑了一个后缀,无论如何是无法匹配的。

以后要注意height[i]实际是两个最接近的后缀的lcp。还有要注意为了方便实际上是把最后一个空字符排到第一的,注意循环初始条件。


三、treap

原题第一次做的时候是用splay来分类维护序列过的,300+ms挺快的,印象中当时调了很久。考试的时候难得再写一遍了,就来了个线段树套权值treap,跑了1s多点,比理论耗时高,一查原因,发现是随机函数生成到第十几个数之后每个随机数都一样了,以后还是用系统的rand()吧。。


你可能感兴趣的:(模板错误总结)