基础算法 143.最大异或对

此题目使用Trie树,代码中的N代表着节点可能的最大个数。

#include<iostream>
using namespace std;

const int N = 3100010;
int son[N][2], num[100010],  idx;

void insert(int k){
    scanf("%d", &num[k]);
    int i = 30;
    int p = 0;
    while(i+1){
        int u = (num[k] >> i) & 1;
        if(!son[p][u])son[p][u] = ++ idx;
        p = son[p][u];
        i --;
    }
}

int find(int n){
    int i = 30, p = 0, res = 0;
    while(i+1){
        int u = (n >> i) & 1;
        if(son[p][!u]){
            res += 1 << i;
            p = son[p][!u];
        }
        else
            p = son[p][u];
        i --;
    }
    return res;
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i ++){
        insert(i);
    }
    int res = 0;
    for(int i = 0; i < n; i ++){
        res = max(res, find(num[i]));
    }
    cout << res;
    return 0;
}

  

posted @ 2022-05-01 17:00  bz-2021  阅读(35)  评论(0)    收藏  举报