洛谷P4735 最大异或和

信誓旦旦的学了可持久化Trie和01Trie来搞,结果出了一点问题,被卡了好久

这篇算是可持久化Trie的笔记

先随便糊了一个暴力,用pre记一下异或前缀和,Xor表示异或总和

pre[i]^Xor就是 (i+1)~n的异或和

这么裸的一个暴力居然给了73分,11个点wa了3个点,

然后考虑做一点简单的优化,最好是能够像最大异或数对那样维护一个01Trie,这样对于每个x都能速查

如果l=1,r=n,那么只要把全部的pre^Xor放到Trie里面,然后差x能取到的最大值

但是现在l,r是有变动的,所以我们要维护多版本的01Trie,只有一个端点还是比较简单的,但是两端都在动,怎么可持久化这问题就比较头疼

就是要找一个维护的方法,每次给出l,r,我们都能拿到由pre[l-1]^Xor pre[l]^Xor … pre[r-1]^Xor构成的01Trie

或者说是拿到一个答案的时候,我们希望他在[l-1,r-1]的范围内

那么建一个可持久化Trie,设end[x]表示可持久化Trie的节点x是序列s中第几个二进制数末尾的节点

设latest[x]表示在可持久化Trie中以x为根的子树中end的最大值,从root[r-1]出发找答案的时候,只考虑latest值不小于l-1的节点

时间复杂度在$O((N+M)log10^7)$

数列里面插入一个0会比较好处理

也可以在每次加入节点的时候将trie的这条链的权值+1

查询的时候判断一个节点是否存在,如果sum[r]-sum[l-1]=0,那么这个值,也就是这条链不是在[l,r]里面出现的,就不考虑

我傻乎乎的关流之后cin和scanf看了好久的问题没看出来,多花了快一个小时,草了