线性基
题目描述
给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
输入输出格式
输入格式:
第一行一个数n,表示元素个数
接下来一行n个数
输出格式:
仅一行,表示答案。
输入输出样例
输出样例#1:
1
说明
$1 leq n leq 50, 0 leq S_i leq 2 ^ {50}$
分析:
一道线性基模板。<不会线性基的看这里>
直接构造线性基然后贪心选取异或得到最大答案即可.
Code:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=70; ll n,b[N],ans; int main() { scanf("%lld",&n);ll x; for(ll i=1;i<=n;i++){ scanf("%lld",&x); for(ll j=60;j>=0;j--){ if(!(x>>j))continue; if(!b[j]){b[j]=x;break;} else x^=b[j]; } } for(ll i=60;i>=0;i--){ if((ans^b[i])>ans)ans^=b[i];} printf("%lld",ans); return 0; }