luogu3812

题目描述

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

输入格式

第一行一个数 \(n\),表示元素个数

接下来一行 \(n\) 个数

输出格式

仅一行,表示答案。

说明/提示

\(1 \leq n \leq 50, 0 \leq S_i < 2 ^ {50}\)


线性基模板题
线性基是一种处理数的集合的异或问题的方法,其实就是把当前的数的集合变为一个可以异或出当前集合中所有数的新的集合。
处理方法网上有很多介绍,我主要是看了下面的博客:
https://blog.csdn.net/a_forever_dream/article/details/83654397


#include<bits/stdc++.h>
using namespace std;
typedef  long long ll;
const int maxn=55;
int n;
ll sz[maxn],d[101];
void insert(ll x)
{
	for(int i=62;i>=0;--i)
	{
		if(x&(1ll<<i))
		{
			if(d[i])x^=d[i];
			else
			{
				d[i]=x;
				break;
			}
		}
	}
}
ll getans()
{
	ll ans=0;
	for(int i=62;i>=0;--i)
		if((ans^d[i])>ans)ans^=d[i];
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&sz[i]);
		insert(sz[i]);
	}
	cout<<getans()<<endl;
	return 0;
}

posted on 2021-08-03 23:11  gryzy  阅读(31)  评论(0编辑  收藏  举报

导航