XOR最大のペア(タイヤ树)

タイトル

XOR最大のペア

解決

一年前、先輩に耳を傾ける私は学び、今見ていない何01trie、良い先輩ああ、そう、この質問について話しています。
XORバイナリ考えるべき参照データを見て\は(a_iをを<31は2 ^ {} \)で、すべての数の考慮事項は、辞書ツリーに、長さ32の2進数を処理する場合、クエリごとのビット比較がそこにさまざまな異なるゴーは、このように、クエリの結果は、あなたがそれで最大かつ継続的に更新された最大値の数を挿入するたびにことを確実にすることがある
私は維持され、直接使用するビットセットで怠惰なビットコンピューティングのこの種を持っていません
ハイレベルからより良い位置に挿入するの一部と考えることができます

コード

#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