結果

問題 No.2977 Kth Xor Pair
ユーザー Yagnik sakhiyaYagnik sakhiya
提出日時 2024-12-07 23:38:09
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,952 bytes
コンパイル時間 866 ms
コンパイル使用メモリ 80,692 KB
実行使用メモリ 91,264 KB
最終ジャッジ日時 2024-12-07 23:38:24
合計ジャッジ時間 14,729 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 RE -
testcase_26 WA -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
testcase_31 RE -
testcase_32 RE -
testcase_33 RE -
testcase_34 RE -
testcase_35 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <set>
#include <queue>

using namespace std;

class TrieNode {
public:
    TrieNode* children[2];
    TrieNode() {
        children[0] = nullptr;
        children[1] = nullptr;
    }
};

class Trie {
private:
    TrieNode* root;

public:
    Trie() {
        root = new TrieNode();
    }

    void insert(int num) {
        TrieNode* node = root;
        for (int i = 31; i >= 0; --i) { // Assuming 32-bit integers
            int bit = (num >> i) & 1;
            if (!node->children[bit]) {
                node->children[bit] = new TrieNode();
            }
            node = node->children[bit];
        }
    }

    int findMinXor(int num) {
        TrieNode* node = root;
        int xorValue = 0;
        for (int i = 31; i >= 0; --i) {
            int bit = (num >> i) & 1;
            // Prefer to go in the opposite direction for minimum XOR
            if (node->children[1 - bit]) {
                xorValue |= (1 << i);
                node = node->children[1 - bit];
            } else {
                node = node->children[bit];
            }
        }
        return xorValue;
    }
};

int main() {
    int N, K;
    cin >> N >> K;  // Read size of array and position K
    vector<int> A(N);
    
    // Read array elements
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
    }

    set<int> uniqueXors; // To store unique XOR results
    Trie trie;

    // Insert first element into trie
    trie.insert(A[0]);

    // Calculate all Ai ⊕ Aj for 1 ≤ i < j ≤ N using trie
    for (int i = 1; i < N; ++i) {
        int minXor = trie.findMinXor(A[i]);
        uniqueXors.insert(minXor);
        trie.insert(A[i]); // Insert current element into trie
    }

    // Convert set to vector and sort it
    vector<int> sortedResults(uniqueXors.begin(), uniqueXors.end());
    
    // Output the K-th value (1-based index)
    cout << sortedResults[K - 1] << endl;

    return 0;
}
0