私は、題し
第二に、分析
$ N $は、その排他的論理和配列、K.シーク少数により生成された数値の任意のサブセットを求め、数値が与えられ
構成線形群$ Bが$、$もし後| Bは| <Nの$、その後数Nは、直鎖状またはグループ排他的アウトすることができ、それは排他的OR $ 0 $に相当することができる別の数で数値を表します。すなわち、この場合には、最小の数として0以上であろう。
$グループに$ 1の数がとら線形に対応する場合、第一大$ K $のために、$ K $は、バイナリ決意を指示することができ、その後、回答を引き出すことができるXOR。
三、ACコード
1つの#include <ビット/ STDC ++ H> 2 3 使用して 名前空間STDを、 4 の#defineっ長い長い 5 の#define MIN(A、B)((A)>(B)?(B):( A)) 6 の#define MAX(A、B)((A)>(B)? (A):( B)) 7 のconst int型 MAXN = 1E4 + 13 。 8 のconst int型 MAXL = 62 。 9 LL [MAXN]。 10 11 構造体LinerBasis 12 { 13 ベクター<LL> VEC。 14 INT N。 15 16 ボイドビルド(LLの*のX、int型N) 17 { 18 本 - > N = N。 19 ベクター<LL>(MAXL + 1 )。 20 のために(int型 i = 1 ; iが<= N; iが++ ) 21 { 22の LLのT =のX [i]は、 23 のために(INT ; J> = J = MAXL 0 ; j-- ) 24 { 25 であれば((T&(1LL << J))== 0 ) 26 続けます。 27 もし([J]) 28 T ^ = A [J]; 29 他の 30 { 31は、 // 既存の低[K]、この排他的論理和tが消える1。 32 // A [K] 0 =影響 33がない ため(INT = K 0、K <J、K ++ ) 34である { 35 IF(&T(1LL << K)) 36 T ^ = A [K]; 37 } 38である // 高い除去しますj番目のビットの[K] 1。 39 用(INT K = j個の+ 1、K <= MaxLの、K ++) 40 { 41 であれば([K]・(1LL << J)) 42 [K] ^ = T。 43 } 44 [j]は= Tと、 45 ブレーク; 46 } 47 } 48 } 49 vec.clear()。 50 のためには、(int型、I = 0 ; I <= MAXL; iは++ ) 51 { 52 場合([i])と 53 vec.push_back([I])。 54 } 55 } 56 57 LLクエリ(LLのK) 58 { 59 // 可能异或出0 60 であれば(vec.size()< N) 61 K-- 。 62 もし(K>(1LL << vec.size()) - 1 ) 63 リターン - 1 。 64 LL ANS = 0 。 65 のために(int型 I = 0 ; iが(vec.sizeを<); iが++ ) 66 { 67 場合(K&(1LL << I)) 68 { 69の ANS ^ = VEC [i]は、 70 } 71 } 72の リターンANS。 73 } 74 75 }ポンド。 76 77 のint main()の 78 { 79 INT T、ケース= 0 。 80 のscanf(" %dの"、&T)。 81 一方(T-- ) 82 { 83 INT N、Q。 84 のscanf(" %dの"&N); 85 のための(int型 I = 1を iが= Nを<; I ++)はscanf関数(" %のLLD "および[I]); 86 87 lb.build(N); 88 89 のscanf(" %のD "& Q); 90 LLのK; 91 のprintf(" ケース#1%のD:\ n "++ ケース); 92 ながら(Q-- ) 93 { 94 のscanf(" %のLLD 」、&K) ; 95 のprintf(" %LLDする\ n " 、lb.query(K))。 96 } 97 } 98 リターン 0 。 99 }