イル] [HDU_3949 XORリニア

私は、題し

  XOR

第二に、分析

  $ 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 }

 

おすすめ

転載: www.cnblogs.com/dybala21/p/11366699.html
おすすめ