이름
결심
노인이 질문에 어떤 01trie, 좋은 수석 아에 대해 이야기 년 전에들을 수 있습니다, 그래서 배우지 않았고, 지금 본다. . . .
XOR 이진 생각해야 참조 데이터 살펴 \는 (A_I는 <31 2 ^ {} \이다) , 모든 숫자를 고려가 사전 트리로, 길이 32의 이진수를 처리 할 때 쿼리 별 비트 비교 다른 다른 이동 따라서 쿼리의 결과 때마다 당신이 그것을에서 가장 크고 지속적으로 업데이트 최대 값의 숫자를 삽입한다는 보장이있다
나는 유지 직접 사용 비트 세트에 게으른 비트 컴퓨팅 이런 종류의가 없습니다
더 나은 위치에 하이 레벨에서 삽입은 몇 가지 생각할 수있다
코드
#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 10;
int n, a, num, ans;
struct node {
int nx[2];
} e[N];
void insert(int n) {
bitset<35>s(n);
int rt = 0;
for (int i = 30; i >= 0; --i) {
int v = (int)s[i];
if (!e[rt].nx[v]) e[rt].nx[v] = ++num;
rt = e[rt].nx[v];
}
}
int query(int x) {
bitset<35>s(x);
int rt = 0, ret = 0;
for (int i = 30; i >= 0; --i) {
int v = (int)s[i];
if (e[rt].nx[v ^ 1]) ret = ret << 1 | 1, rt = e[rt].nx[v ^ 1];
else ret <<= 1, rt = e[rt].nx[v];
}
return ret;
}
int main() {
cin >> n;
for (int i = 1, x; i <= n; ++i) {
cin >> x;
ans = max(ans, query(x));
insert(x);
}
cout << ans;
}