問題の解決策
B I ^ K = I
B ^ K ^ K = K ^
B = ^ K
暴力の実践:
AとBの間で発生する可能性のあるすべてのkについての統計は、最小のを見つけます
チラリ範囲は、私が暴力を放棄し、それがTになると思います
次いで考え、最小kは確かに、[1]に表示され、排他的OR Bで得られた全ての結果
[1]と大に小さな由来する排他的OR Bの全ての結果について
試験K [i]との排他的OR B Bによって生成された[2〜N]は、元の配列に存在します
そこでは、次の2つに設定しましたが、それはそのBの裁判官をクリアしているかどうかができなくなったため、再び、TLE警告
その後、第一の反応バイナリ検索ツリー、およびそれを安定させるには、ツリーのバランスをとることがあるの半分であるように見える、試したことのない
数日前にちょうど学んセット(赤黒木を)を利用することができ、
ラインに一度、直接出力
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],k[N];
int n,m;
set<int>s;
int main(){
ios::sync_with_stdio(0);
int T;
cin>>T;
for (int cs = 1; cs <= T; ++cs) {
s.clear();
cin>>n;
for (int i = 1; i <= n; ++i) {
cin>>a[i];
}
for (int i = 1; i <= n; ++i) {
cin>>b[i];
k[i]=a[1]^b[i];
s.insert(b[i]);
}
sort(k+1,k+1+n);
int cnt=unique(k+1,k+1+n)-k-1;//去重
for (int i = 1; i <= n; ++i) {
bool f=true;
for (int j = 2; j <= n; ++j) {
int t=a[j]^k[i];
if(s.find(t)==s.end()){//判断是否找到 如果没找到 s.find()==s.end()
f=false;
break;
}
}
if(f) {
cout<<k[i]<<endl;
break;
}
}
}
return 0;
}