Codeforces-613D Dr. Evil Underscores

Description

Today, as a friendship gift, Bakry gave Badawy nn integers \(a_1,a_2,…,a_n\) and challenged him to choose an integer \(X\) such that the value \(\mathop{max}\limits_{1≤i≤n}(ai⊕X)\) is minimum possible, where ⊕ denotes the bitwise XOR operation.

As always, Badawy is too lazy, so you decided to help him and find the minimum possible value of \(\mathop{max}\limits_{1≤i≤n}(ai⊕X)\).

Input

The first line contains integer \(n (1≤n≤10^5)\).

The second line contains \(n\) integers $ a_1,a_2,…,a_n(0≤a_i≤2^{30}−1).$

Output

Print one integer — the minimum possible value of \(\mathop{max}\limits_{1≤i≤n}(ai⊕X)\)

Examples

input

3
1 2 3

output

2

input

2
1 5

output

4

Note

In the first sample, we can choose \(X=3\).

In the second sample, we can choose $ X=5$.

题意

给定n个数,求一个数x使得\(\mathop{max}\limits_{1≤i≤n}(ai⊕X)\)最小,并输出\(\mathop{max}\limits_{1≤i≤n}(ai⊕X)\)

题解

我们从最高位向低位分治,对于每一位,\(O(n)\)扫一遍所有的数,如果这一位所有数都是1,或者所有数都是零,我们就可以让这一位对答案不产生贡献,否则这一位产生的贡献是不可避免的,我们只需要看后面的数产生的贡献哪个比较小就可以了。这样我们把这一位是1的,和这一位是0的分成两个集合,分别递归下去,取返回值较小的,加上\(1 << d\)即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 50;
vector<int> v;
typedef long long ll;
ll dfs(int d, vector<int> v) {
    if (v.size() == 0 || d < 0) return 0;
    vector<int> v1, v0;
    for (int i = 0; i < v.size(); i++) {
        if ((v[i] >> d) & 1) v1.push_back(v[i]);
        else v0.push_back(v[i]);
    }
    if (v0.size() == 0) return dfs(d - 1, v1);
    else if (v1.size() == 0) return dfs(d - 1, v0);
    else return min(dfs(d - 1, v1), dfs(d - 1, v0)) + (ll)(1 << d);
}
int main() {
    int n;
    scanf("%d", &n);
    int maxx = 0;
    for (int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);
        v.push_back(x);
        maxx = max(maxx, x);
    }
    int cnt = 0;
    while (maxx) {
        maxx >>= 1;
        cnt++;
    }
    printf("%lld\n", dfs(cnt, v));
    return 0;
}
posted @ 2020-01-12 17:35  Artoriax  阅读(351)  评论(0编辑  收藏  举报