【模板】线性基

题目描述

给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

输入输出格式

输入格式:

第一行一个数n,表示元素个数

接下来一行n个数

输出格式:

仅一行,表示答案。

输入输出样例

输入样例#1: 复制
2
1 1
输出样例#1: 复制
1

说明

1n50,0Si2^50

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll a[100010], b[70];
ll n, ans=0;
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	for (int i = 0; i <n; i++)
		for (int j = 62; j >= 0; j--)
			if (1ll << j & a[i])
				if (!b[j]) {
					b[j] = a[i];
					break;
				}
				else
					a[i] ^= b[j];
	for (int i = 62; i >= 0; i--)
		ans = max(ans, ans^b[i]);
	cout << ans << endl;
	return 0;
}
//c++ max函数头文件是#include<algorithm>

  

原文地址:https://www.cnblogs.com/52dxer/p/10353489.html