关于为什么求最大异或和一定要先求出线性基,不能直接拿原来的值直接异或的问题

这个问题也困扰了我很久,下面我们看求最大异或和的代码(部分),b是储存得到的线性基

for(int i = len - 1; i >= 0; --i){
	if((ans ^ b[i]) > ans){
		ans ^= b[i];
	}
}

举一个例子就好了。

比如我们有6,5,4个数,要求最大异或和,我们先写出它们的二进制

110

101

100

如果我们直接用6,5,4求的话,过程为

ans = 0;

ans ^ 6 > ans --> ans = 6

ans ^ 5 < ans --> ans不变,ans = 6

ans^4 < ans --> ans不变,ans = 6

这样得出的结果是6

下面是用线性基求得过程,6,5,4的线性基为

110

001

000

这样很显然,结果为7,大于6。

过于专业的证明由于博主太垃圾,不能给出。。。

猜你喜欢

转载自blog.csdn.net/weixin_43737952/article/details/88663903
今日推荐