データ復旧のHDU 6477・セット

問題の解決策

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;
}
公開された43元の記事 ウォンの賞賛0 ビュー1246

おすすめ

転載: blog.csdn.net/Yubing792289314/article/details/104271628