线性基是极小的能异或出任意元素异或出来的值的集合.
线性基可以合并,不是很可以支持删除,但看过相关的博客好像有神仙可以.
删除可以弄存活区间然后线段树.
设线性基中有i个元素,那么共有(2^i)种异或值,每种值出现了(2^{n-i})次.
异或值最大就从高位往低位贪心选取,如果当前答案没有这一位就异或上.
异或值最小就是最低存在位的答案.
取异或d的最大值,把异或值最大的初值赋成d.
取第k小值.
先把线性基上的元素化作最小的形式.
也就是说,每个数都是有这一位的最小的数了.
那么,我们类似倍增lca求lca的思路,从大的二进制位开始枚举.
如果k>1<<i,就异或上这个数,同时相当于k-=1<<i.
每一个有数的位都相当于是一次线段树上向两边中一边的选择的操作.
这一位选1,或者不选1都各有1<<i个数.
如果选了1,就有这一位选0的1<<i个数比它小,所以k必须能&1<<i.
对于图上的异或路径数,可以转换成树,然后有若干个环在线性基里随便异或.
1.梦想封印