====== 线性基 ====== ===== 定义 ===== 对于一组数 $a_1,a_2,...,a_n$ ,他们的线性基为 $p_1,p_2,...,p_m$ ,其中 $p_i$ 是指出现1的最高位在第 $i$ 位上的那个数。 ===== 构造方法 ===== 对于每个数,我们先找出他的最高位的1在第 $i$ 位,假如 $p_i$ 此时为零,那么将这个数假如线性基,否则异或 $p_i$ 继续找。 ===== 应用 ===== ==== 求一组数中若干个数异或值的最大值 ==== 根据线性基的性质,直接将线性基中的所有数异或起来即可 ==== 求一组数中若干个数异或的第 k 小 ==== 将 $k$ 分解为二进制,第 $2^i$ 位对应线性基中从低到高的第 $i-1$ 个非空位,若是1则将答案异或上线性基中这一位的数 ==== 询问一个数在一堆数中的任意异或值排第几(算上重复) ==== 一堆数取若干个数的异或值,每种异或值出现的次数都是相等的,$2xor(n-|B|)$ ===== 例题 ===== [[https://www.luogu.com.cn/problem/P3812|洛谷p3812]] #include #define reg register using namespace std; typedef long long ll; const int MN=60; ll a[61],tmp[61]; bool flag; void ins(ll x){ for(reg int i=MN;~i;i--) if(x&(1ll<=(1ll<