Dr.イーブルアンダースコア
今日では、友情の贈り物として、BakryはBadawy nnは整数A1、A2、...、ANA1、A2、...、および、そのような値max1≤i≤n(ai⊕X)max1≤iその整数XXを選択するために彼に挑戦しました⊕⊕を表す≤n(ai⊕X)は、最小可能である ビット単位のXOR演算を。
あなたが彼を助けるとmax1≤i≤n(ai⊕X)max1≤i≤n(ai⊕X)の可能な最小値を見つけることにしましたので、いつものように、Badawyは、あまりにも怠惰です。
入力
最初の行は、NN(1≤n≤1051≤n≤105)整数含ま。
2行目はNN整数A1、A2、...、ANA1、A2、...、(0≤ai≤230-10≤ai≤230-1)が含まれています。
出力
max1≤i≤nの最小可能値(ai⊕X)max1≤i≤n(ai⊕X) - オン整数を印刷します。
リンク:http://codeforces.com/contest/1285/problem/D
問題の意味:、xおよびXORアレイ、又は発散アレイ内の最大値を探し、その最小値と最大そう。
解決策:分割統治の辞書の木のDPが(完了するDP)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
ll solve(vector<ll> a,int b)
{
if(b==-1)return 0;
ll temp = 1ll<<b;
vector<ll> l, r;
for(auto i:a)
{
if(i<temp)l.push_back(i);
else r.push_back(i-temp);
}
if(l.empty())return solve(r,b-1);
if(r.empty())return solve(l,b-1);
return min(solve(l,b-1),solve(r,b-1))+temp;
}
int main(){
int n;
cin>>n;
vector<ll> a(n);
for(int i=0;i<n;i++)
cin>>a[i];
sort(a.begin(),a.end());
cout<<solve(a,32)<<endl;
return 0;
}