Evanyou Blog 彩带

  题目传送门

线性基

题目描述

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

输入输出格式

输入格式:

 

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

接下来一行n个数

 

输出格式:

 

仅一行,表示答案。

 

输入输出样例

输入样例#1: 
2
1 1
输出样例#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;
}
原文地址:https://www.cnblogs.com/cytus/p/9330114.html