题意
题解
选择线性基的一组子集,使异或值最大。构造一组线性基,构造的过程类似高斯消元,将数字按二进制展开,使基的元素对应主对角线的非零元所在行代表的数。
主对角线为 1 1 1 的列其余位置为 0 0 0,则取这个元素使此位值为 1 1 1;若出现非主对角线位置为 1 1 1 的元素,对应行的更高位必有对应的主对角线为 1 1 1 的值,显然应该优先考虑更高位的 1 1 1。故线性基的异或值为答案。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxl 60
typedef long long ll;
int N;
ll B[maxl + 1];
void insert(ll n)
{
for (int i = maxl; i >= 0; --i)
{
if (n >> i & 1)
{
if (B[i])
n ^= B[i];
else
{
for (int j = 0; j < i; ++j)
if (n >> j & 1)
n ^= B[j];
for (int j = i + 1; j <= maxl; ++j)
if (B[j] >> i & 1)
B[j] ^= n;
B[i] = n;
break;
}
}
}
}
ll getMax()
{
ll res = 0;
for (int i = 0; i <= maxl; ++i)
res ^= B[i];
return res;
}
int main()
{
scanf("%d", &N);
for (int i = 0; i < N; ++i)
{
ll a;
scanf("%lld", &a);
insert(a);
}
printf("%lld\n", getMax());
return 0;
}