loj #113. 最大异或和
#113. 最大异或和
内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: 匿名
题目描述
这是一道模板题。
给由 n nn 个数组成的一个可重集 S SS,求一个集合 T⊆S T \subseteq ST⊆S,使 T1xorT2xor…xorT|T| 最大。
输入格式
第一行一个数 n nn。
第二行 n nn 个数,表示集合 S SS。
输出格式
T1xorT2xor…xorT|T| 的最大值。
样例
样例输入
3
5 2 8
样例输出
15
数据范围与提示
1≤n≤50,0≤Si≤250 1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}1≤n≤50,0≤Si≤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; }