XOR 최대 쌍 (타이어 树)

이름

XOR 최대 쌍

결심

노인이 질문에 어떤 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;
}

추천

출처www.cnblogs.com/lykkk/p/11256831.html