P3812 【模板】线性基


P3812 【模板】线性基



时间限制 1.00s
内存限制 250.00MB


题目背景


这是一道模板题。


题目描述


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


输入格式

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

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


输出格式


仅一行,表示答案。


输入输出样例


输入 #1

2
1 1

输出 #1

1

说明/提示

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



推荐jklover线性基


代码


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int N=50+5;
ll a[N]; 
void Insert(ll x){
	for(int i=62;~i;--i)
		if(x&(1ll<<i)){
			if(!a[i]){ a[i]=x; return ; }
			x^=a[i];
		}
}
ll Query(){
	ll res=0;
	for(int i=62;~i;--i)
		res=max(res,res^a[i]);
	return res;
}
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		ll x; scanf("%lld",&x);
		Insert(x);
	}
	printf("%lld",Query());
	return 0;
}
原文地址:https://www.cnblogs.com/Potrem/p/Luogu_P3812.html