正题
题目链接:https://www.luogu.com.cn/problem/P3812
题目大意
给出nnn个数,求在其中选出若干个数使得它们的异或和最大。
解题思路
序列aaa的线性基bbb满足以下性质
- aaa中的任何一个数都可以由bbb中的若干个数异或得到
- bbb中的任何一个数都不可由bbb中的若干个数异或得到
- bbb是满足性质1,21,21,2的最小集合
如何用线性基求该题?求序列aaa的最大异或和其实就是求其线性基的最大异或和,而且我们知道对于线性基中的数did_idi满足它的i+1i+1i+1位为111。
所以对于每个did_idi如果答案异或上他可以变大那么久异或上它即可。
时间复杂度O(50n)O(50n)O(50n)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,d[60];
void add(ll x){for(ll i=51;i>=0;i--){if(x&(1ll<<i)){if(d[i])x^=d[i];else{d[i]=x;break;}}}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);add(x);}ll ans=0;for(ll i=51;i>=0;i--)if(ans<(ans^d[i]))ans=ans^d[i];printf("%lld",ans);
}