枚举子集

網易の顔の質問

文字列操作、操作の2種類をお読みください。フォーマット1 xまたは2×。

読み出し動作1は、集合AはXに押されたとき。

ときに読み出し動作2、Aのサブセットがある場合にそれをチェック出力がYES、NO出力NOがない場合ならば、全ての検索結果のサブセット「または操作」の数は、xに等しいです。

 

直接既存のレコードへのクエリは、条件を満たしたときに2を読み込むときに、アイデアは1で読んだときに、すべての可能なシナリオはすべてを記録することです。

ここでは、スキルのセットのどのサブセットを列挙するために使用しました。

列挙のセットの方法サブセット:https://www.cnblogs.com/Emerald/p/4695672.html

S //列挙サブセット
のための(INT I = S; I; I =(1-I)&S){ 
  //特定の操作
}

  

 

参考答え:https://www.nowcoder.com/discuss/216237

 

#include <ビット/ STDC ++ H> 
使用して名前空間std; 
//各問い合わせについて、我々は、全てのYを選択== X、Y&Yを満足する、すなわち、yはxのサブセットであり、バイナリ表現です。
//次に我々は、配列P [i]は、それはすべてのサブセットの値を表しまたは私は数字の数で維持することができます。
それが繰り返されていない場合は、番号を挿入//たびに、それがスーパーセットが答えを更新し列挙します。尋ねられたときだけPを見て、[x]はうまくxに等しいです。

Pはint [131072]; 
//バイナリ(1,111,111,111,111)が131071 10進数に変換され、MX = 131071は、INT 
INT Qを、
int型のmain(){ 
    scanfの( "%のD"、&Q); 
    一方、(Q - ){ 
        int型のOP、 X; 
        scanfの( "%のDの%のD"、&OP、&x)は、
        IF {(OP == 1)
            (P [X] == x)が続く場合、
            INT X ^ S = MX; // X-ネゲート     
            ため(I = sのint型; I; I =(I-1)&S){// だ列挙サブセット
                P [I ^ X] = P [I ^ X] | X; // iは^ xが間に設定されます違い
            }
            P [X] = xと; 
        } 
        他{ 
            IF(P [X] == x)のプット( "YES")。
            他のプット( "NO"); 
        } 
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/liugl7/p/11303917.html