题意:大致题意: 给定数组 , 定义数组 , 对数组 可以任意排序,定义 为最大的
因为是 ,二进制下某位是1 一定是所有的 二进制下当前位上都是1 ,也就是说 一定能组成01互补
为了使得 最大,我们从最高位往低位一位一位枚举,高位确定了,就不能变,只能在满足高位的条件下改变低位的顺序
我们用 记录当前合法答案,用 表示取反的 ,表示,每次枚举一位,保证每次检查只检查当前合法且下一位是否合法,并不关心更低位是否合法,然后sort一下,判断一下是否相等
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int t,n,a[N],b[N],c[N],d[N];
bool check(int x)
{
for(int i=1;i<=n;i++) c[i]=a[i]&x;
for(int i=1;i<=n;i++) d[i]=~b[i]&x;
sort(c+1,c+1+n),sort(d+1,d+1+n);
for(int i=1;i<=n;i++) if(c[i]!=d[i]) return false;
return true;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
int res=0;
for(int i=30;i>=0;i--) if(check(res|1<<i)==true) res|=1<<i;
printf("%d\n",res);
}
}