1285D - Dr. Evil Underscores
link
题意:给定数列ai,可以选择任意的数字与数列所有数字x进行异或,所有结果中的最大值为答案。求所有答案中的最小值。
位运算,从最高位开始遍历,根据当前位置把所有数字分组。
- 如果当前位置全是1或者全是0,答案当前位就是0(因为全是一样的,所以x中的这个位置可以取和当前位置的相同值,xor以后这一位就是0)。
- 否则就将他们分组,取最后的最小值,同时答案中的当前位为1再进行
int n,m;
int solve(vector<int> v,int len){
if(len<0||v.size()==0) return 0;
vector<int> zero,one;
for(int i=0;i<v.size();i++){
if((v[i]>>len)&1==1)
zero.push_back(v[i]);
else
one.push_back(v[i]);
}
if(one.size()==0)
return solve(zero,len-1);
if(zero.size()==0)
return solve(one,len-1);
return (min(solve(one,len-1),solve(zero,len-1))|1<<len);
}
int main(){
n=ird();
vector<int> a;
for(int i=0;i<n;i++){
int tt=ird();
a.push_back(tt);
}
cout<<solve(a,30)<<endl;
return 0;
}