> 文档中心 > P3812 线性基详解

P3812 线性基详解

【模板】线性基 - 洛谷

将若干个数异或起来的的最大值是多少?

题解:

这里我们还是采用贪心的思想,从最高位开始异或,一直向下。这里我们可以使用线性基来保存二进制下的信息。

void insert(int x){for(int i=62;i>=0;i--){if((x>>i)&1){if(!p[i]) {p[i]=x;break;}x^=p[i];}}}

这样线性基就具有以下性质:

1:查询是否能被其他数异或出来;

int insert(int x){for(int i=62;i>=0;i--){if((x>>(ll)i)&1){if(!p[i]) {p[i]=x;break;}x^=p[i];}}return x;}

2:查询异或最大值或最小值;

 int askmx() {int ans=0;for(R int i=62;i>=0;i--)if((ans^p[i])>ans) ans^=p[i];return ans;}
int askmn() {if(zero) return 0;//判断原数组是否有0;for(R int i=0;i<=62;i++)if(p[i]) return p[i];}

3:查询第K大(小);

void rebuild() {cnt=0;top=0;for(R int i=MB;i>=0;i--)for(R int j=i-1;j>=0;j--)if(p[i]&(1LL<<j)) p[i]^=p[j];for(R int i=0;i=(1LL<=0;i--)if(k&(1LL<<i)) ans^=d[i];return ans; }

线性基和01trie的区别:

线性基和01trie都能对树的异或进行处理,但是线性基作用更为广泛,能对很多个数操作;但是01trie只能每次查询当前数与其他数的异或最大值,算是各有胜场了。

给上01trie的题:P4551 最长异或路径(XOR 异或 dfs 字典树 trie 贪心)_Jack_00_的博客-CSDN博客

完结撒花~