F - Xor Minimization Editorial by nok0

補足

この問題の原案者です。少しだけ補足をします。

はじめに入力の \(A\) をソートしておくと、公式解説で再帰的に作られる配列は \(A\) の中の区間であることが分かります。

このことを用いると、毎回配列を構築する必要がなくなり定数倍を良くすることができます。

実装例(c++):

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for(auto &v : a) cin >> v;
    sort(a.begin(), a.end());
    auto f = [&](auto f, int l, int r, int d = 30) -> int {
        if(d == -1) return 0;
        if((a[l] ^ a[r - 1]) >> d & 1) {
            int m = distance(a.begin(), lower_bound(a.begin() + l, a.begin() + r, a[r - 1] >> d << d));
            return min(f(f, l, m, d - 1), f(f, m, r, d - 1)) + (1 << d);
        } else
            return f(f, l, r, d - 1);
    };
    cout << f(f, 0, n) << endl;
}

posted:
last update: