Solution S o l u t i o n
划水中。。迟早要完
显然要线性基。。
考虑求
k
k
大。
对于基的每一个位置,因为其最高非零位就是位置标号,那看一下的这一位是否为
1
1
<script type="math/tex" id="MathJax-Element-12">1</script>,看是否要异或上(或者不异或)使得这一位得到的答案较大。
#include <bits/stdc++.h>
#define show(x) cerr << #x << " = " << x << endl
using namespace std;
typedef long long ll;
typedef pair<int, int> Pairs;
const int N = 101010;
inline char get(void) {
static char buf[100000], *S = buf, *T = buf;
if (S == T) {
T = (S = buf) + fread(buf, 1, 100000, stdin);
if (S == T) return EOF;
}
return *S++;
}
template<typename T>
inline void read(T &x) {
static char c; x = 0; int sgn = 0;
for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1;
for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
if (sgn) x = -x;
}
struct linearBasis {
int a[32];
int siz;
inline int size(void) {
return siz;
}
inline int insert(int x) {
for (int i = 30; ~i; i--)
if (x >> i & 1) {
if (!a[i]) {
a[i] = x; return ++siz;
} else x ^= a[i];
}
return 0;
}
inline int query(int k) {
int res = 0, cnt = siz;
for (int i = 30; ~i; i--) {
if (!a[i]) continue;
--cnt;
int tmp = max(res, res ^ a[i]);
if (k >> cnt & 1) res = tmp;
else res = tmp ^ a[i];
}
return res;
}
} LB;
int n, x, mx;
int main(void) {
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
read(n);
while (n--) {
read(x); LB.insert(x);
}
int L = 0, R = (1 << LB.size()) - 1, Mid, Ans;
printf("%d ", mx = LB.query(R));
while (L <= R) {
int Mid = (L + R) >> 1;
if (LB.query(Mid) < mx) L = (Ans = Mid) + 1;
else R = Mid - 1;
}
printf("%d\n", LB.query(Ans));
return 0;
}