The XOR Largest Pair

The XOR Largest Pair_第1张图片
题解:对题目中的所有数字构建一颗01字典树,然后贪心的寻找使着异或最大的路径遍历下去,树的每个节点深度为31,故数组应开3e6以上

#include 
using namespace std;
const int maxn=3e6+5;

int trie[maxn][2],tot;
int A[maxn];

void Insert(int x){
    int root=0;
    for(int i=31;i>=0;i--){
        int id=(x>>i)&1;
        if(!trie[root][id]) trie[root][id]=++tot;
        root=trie[root][id];
    }
}

int query(int x){
    int ans=0,root=0;
    for(int i=31;i>=0;i--){
        int id=(x>>i)&1,c=id^1;
        if(trie[root][c]){
            ans=ans<<1|1;
            root=trie[root][c];
        } else {
            ans=ans<<1;
            root=trie[root][id];
        }
    }
    return ans;
}

int main(){
    int n; scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x; scanf("%d",&A[i]);
        Insert(A[i]);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,query(A[i]));
    }
    cout<

你可能感兴趣的:(字典树Trie)