「トライ」最大の排他的論理和

のXORの最大

元の質問へのリンク:XORの最大

効果の対象に

あなたは\(N \)数は、最大の結果を得るために2つの番号から選択XOR演算数です

問題のトピックソリューション

ルーチンのタイトルを作成する方法がわからない書いたことはありません

最初の分析は貪欲可能で、二つの数字は、我々はできるだけ大きくたいと思いますので、高できるだけ大きくすることができた場合、すなわち、それは、この時間の最大の同じビットの2進数の異なると言うことです、ので、どのようにすぐにそれを満たしますか?私たちは、それはトライがうまく走った直接の数を構築するために、この問題は非常にシンプルであること、トライは、上記の電流が0から1には、可能な限り行くことである、可能な限り行くために、現在の1 0を解決する2進数に変換することができました

//#define fre yes

#include <cstdio>
#include <iostream>

const int N = 100005;
struct Node {
    int son[2];
} trie[N * 30];
int a[N], idx;

void Insert(int x) {
    int rt = 0;
    for (int i = 30; i >= 0; i--) {
        int id = x >> i & 1;
        if(!trie[rt].son[id]) trie[rt].son[id] = ++idx;
        rt = trie[rt].son[id];
    }
}

int Search(int x) {
    int rt = 0, ans = 0;
    for (int i = 30; i >= 0; i--) {
        int id = x >> i & 1;
        if(trie[rt].son[!id]) {
            rt = trie[rt].son[!id];
            ans += (1 << i);
        } else rt = trie[rt].son[id];
    } return ans;
}

int main() {
    static int n, ans;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        Insert(a[i]);
    } for (int i = 1; i <= n; i++) ans = std::max(ans , Search(a[i]));
    printf("%d\n", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Nicoppa/p/11526192.html