因为是题目小结嘛……所以就:\(\mathcal{P}\text{ortal}.\)
求序列第 \(k\) 小异或和
首先特判存在异或和为零的情况。
由于线性基与序列元素表示出相同的线性异或空间,所以实际上是求线性基表示出的第 \(k\) 小异或和。考虑将 \(k\) 二进制分解的过程,实际上就是第 \(i\) 位上的数值乘上第 \(i\) 位的权重(即 \(2^i\))之和。类似地,将 \(\{d\}\) 按下标升序排序得到 \(d_{p_1},d_{p_2},\dots,d_{p_k}\),定义第 \(i\) 位的权重为 \(d_{p_i}\) 即可。
然而直接这样做是存在问题的。考虑 \(d_{p_j}\) 可能除了 \(p_j\) 这一位是 \(1\) 之外,\(p_i\) 这一位也是 \(1\)(\(i<j\)),这就会使异或和变小。咋办呢?重新处理一下 \(\{d\}\),使得上述情况不发生即可。就像这样:
void initialize() {
for(int i=0;i<=60;++i)
for(int j=0;j<i;++j)
if(d[i]>>j&1) d[i] ^= d[j];
}
CodeForces - 587E Duff as a Queen
首先,查询任意子集不同异或和就是 \(2\) 的区间线性基大小次方。
对于区间的修改,不能将线性基全部异或同一个数,比如 \((01)_2,(10)_2,(11)_2\),线性基为 \(\{1,2\}\),异或某个数 \(k\),那么线性基内 \(1\text{ xor }k\text{ xor }2\text{ xor }k\) 还是 \(3\),而不是我们期望的 \(3\text{ xor }k\).
但一个一个修改再重构显然是不现实的,这里有个差分的转化:令 \(b_i=a_{i-1}\text{ xor }a_i\),那么 \([a_l,a_r]\) 的线性基与 \(a_l,[b_{l+1},b_r]\) 的线性基等价。对于 \(b\) 数组而言,修改操作就变成修改 \(b_l,b_{r+1}\).
用线段树维护 \(b\) 区间的线性基,复杂度 \(\mathcal O(n\log n\log V)\)。对于 \(a\),由于异或操作具有可加性,所以用树状数组维护修改前缀和即可差分出 \(a_l\).
[BZOJ 2844] albus 就是要第一个出场
\(\mathcal{C}\text{onclusion}\):设 \(n\) 个数的线性基大小为 \(k\),那么在 \(n\) 个数的 \(2^n\) 个异或和之中,每种异或和出现 \(2^{n-k}\) 次。
考虑证明。由于不在线性基的数的异或和有 \(2^{n-k}\) 种方案,且每种异或和都有线性基内的数构成 唯一 的与之相等的异或和,所以有 \(2^{n-k}\) 种异或和为 \(0\) 的方案,且这也是所有异或和为 \(0\) 的方案(注意,什么都不选也是一种方案)。
那么对于每种异或和(也即线性基构造的异或和),我们可以将它异或所有 \(0\) 异或和,这样还会得到这种异或和。结论感性地得证。
那么类似求序列第 \(k\) 小异或和,将给定 \(Q\) 按主元二进制分解("主元" 指 \(d_i\) 的最高位),即可得到 \(Q\) 的排名。因为不是计算第 \(k\) 小,甚至都不需要预处理 \(\{d\}\).
[WC 2011] Xor
也算是个性质题吧 qwq.
首先算出任意一条从 \(1\) 到 \(n\) 的路径 \(P\),记其权值为 \(v\)。然后找出图中所有的简单环,将它们插入线性基,用 \(v\) 在线性基里面查询最大值即可。感性理解的话,就是将 "异或环" 看作一种运算:从某点走到环上一点 \(r\),绕一圈,再从 \(r\) 原路返回(像一个气球)。如果想要维持从 \(1\) 到 \(n\) 的连通性的话,施加 "异或环" 即可。走路径再回来相当于零环,是无意义的。
CF724G Xor-matic Number of the Graph
和上一题很类似,就直接:\(\mathcal{P}\text{ortal.}\)