Evanyou Blog 彩带

洛谷P3812 【模板】线性基 [线性基]

  题目传送门

线性基

题目描述

给定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;
}

 

 

 

 

posted @ 2018-07-18 16:43  HolseLee  阅读(250)  评论(0编辑  收藏  举报