首页 > 其他 > 详细

[洛谷P3812]【模板】线性基

时间:2018-09-20 17:06:46      阅读:166      评论:0      收藏:0      [点我收藏+]

题目大意:给定$n$个数,选取任意个数,使得他们的异或和最大。

题解:线性基,原理贪心看不懂。

对于每一个数,设它的最高位的$1$在第$i$位,如果此时$P_i$为空,就将这个数加入线性基,否则异或上$P_i$继续找。最后贪心看$ans$异或上线性基的这一位会不会变大,若变大就转移

卡点:

 

C++ Code:

#include <cstdio>
int n;
long long x, p[55], ans;
int main() {
	scanf("%d", &n);
	while (n --> 0) {
		scanf("%lld", &x);
		for (int i = 50; ~i; i--) {
			if (x & 1ll << i) {
				if (p[i]) x ^= p[i];
				else {p[i] = x; break;}
			}
		}
	}
	for (int i = 50; ~i; i--) if (ans < (ans ^ p[i])) ans = ans ^ p[i];
	printf("%lld\n", ans);
	return 0;
}

  

[洛谷P3812]【模板】线性基

原文:https://www.cnblogs.com/Memory-of-winter/p/9681681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!