线性基
下文记 \(f_{\max}(x),f_{\min}(x)\) 代表 \(x\) 和线性基中的元素进行异或操作得到的最大 / 最小值。
用高斯消元法求出来线性基,回顾我们求 \(f_{\min}(x)\) 的过程,考虑一组基向量 \(b_{1 \sim k}\),它们每个向量在二进制位下的最高位 \(p_{1 \sim k}\) 都不同,把这些位置称为关键位。考虑把一个数加入线性基时,从高往低比较每个基,如果 \(p_i\) 位是 \(1\) 就异或上这个向量,最后得到的向量就是最小的。
我们形式化写出来,那么有:
\[f_{\min}(x) = x \oplus \bigoplus_{i=1}^k (x_{p_i} \times b_i)
\]
我们把 \(x \oplus y\) 带入这个公式:
\[f_{\min}(x \oplus y) = (x \oplus y) \oplus \bigoplus_{i=1}^k ((x_{p_i} \oplus y_{p_i}) \times b_i)
\]
由于 \(x_{p_i},y_{p_i}\) 只有 \(0/1\),所以右边的乘法可以拆开,那么有结论:
\[\boxed{f_{\min}(x \oplus y) = f_{\min}(x) \oplus f_{\min}(y)}
\]
同样我们考虑 \(f_{\max}(x)\),写出来形式化的式子:
\[f_{\max}(x) = x \oplus \bigoplus_{i=1}^k ((x_{p_i} \oplus 1)\times b_i) = x \oplus \bigoplus_{i=1}^k (x_{p_i} \times b_i) \oplus \bigoplus_{i=1}^k b_i
\]
那么有第二个结论:
\[\boxed{f_{\max}(x) = f_{\max}(0) \oplus f_{\min}(x)}
\]
那么是不是可以做 \(O(1)\) 查询两点间异或最短路,最长路了。

浙公网安备 33010602011771号