模板错误总结

本文总结了在使用链接-cut树(LCT)、后缀数组和Treap时常见的错误及其解决方案。在LCT操作中强调了splay和rotate的正确使用;在后缀数组的二分查找中,解释了height数组的正确理解;在Treap应用中,指出了随机数生成可能导致的问题,并建议使用系统提供的rand()函数。
摘要由CSDN通过智能技术生成

一、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()吧。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值