loj #113. 最大异或和

 

#113. 最大异或和

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名

题目描述

这是一道模板题。

给由 n nn 个数组成的一个可重集 S SS,求一个集合 T⊆S T \subseteq STS,使 T1xorT2xorxorT|T| 最大。

输入格式

第一行一个数 n nn。
第二行 n nn 个数,表示集合 S SS。

输出格式

T1xorT2xorxorT|T| 的最大值。

样例

样例输入

3
5 2 8

样例输出

15

数据范围与提示

1≤n≤50,0≤Si≤250 1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}1n50,0Si​​250​​

 

/*
    求线性基即可
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 55
using namespace std;
int n;
long long a[maxn],b[maxn];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        for(int j=50;j>=0;j--){
            if((a[i]>>j)&1){
                if(b[j])a[i]^=b[j];
                else {
                    b[j]=a[i];
                    for(int k=j-1;k>=0;k--)if((b[j]>>k)&1)b[j]^=b[k];
                    for(int k=j+1;k<=50;k++)if((b[k]>>j)&1)b[k]^=b[j];
                    break;
                }
            }
        }
    }
    long long ans=0;
    for(int i=0;i<=50;i++)ans^=b[i];
    cout<<ans;
    return 0;
}

 

posted @ 2018-04-14 15:21  Echo宝贝儿  阅读(1221)  评论(0)    收藏  举报