题意:
给定一个l = 0
,r
,数组a[i]
是数值从l
到r
的一个全排列,然后选择了一个数x,定义数组
b[i] = a[i] ^ x,
给出b[i]
数组,问x
是多少?
首先分析按位异或的影响:对某位而言:
异或1 :对该位取反
异或0 :保持该位不变
那么对于一段排列而言,我们对其异或上一个数x后产生的影响为:
x的某位为1:原始序列的所有数字该位1和0数量互反
x的某位为0:原始学列的所有数字该位1和0数量保持不变
从头开始统计每位1的数量,同时统计给定序列该位1的数量,如果不相等,异或值x的该位一定为1。最后输出答案就行。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50;
int a[N],f[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
f[0]=1;
f[1]=1;
for(int i=2;i<=35;i++) {
f[i]=f[i-1]*2;
}
int t;
cin>>t;
while(t--){
memset(a,0,sizeof(a));
int l,r;
cin>>l>>r;
int m=r-l+1;
for(int i=1;i<=m;i++){
int x;
cin>>x;
for(int j=17;j>=0;j--){
if(x&(f[j])) ++a[j];
}
}
int ans=0;
for(int j=17;j>=0;j--){
if(a[j]*2>m) ans|=(f[j]);
}
cout<<ans<<"\n";
}
}