ヒョードルと新しいゲーム(XOR演算)

トピックへのリンク:http://codeforces.com/problemset/problem/467/B

 

タイトル効果:プレーヤーは、M + 1番目及びnは兵士の種類を有します。所定のj番目のビットは、プレイヤーがこの種jの兵士を持っていることを示し、1であれば、各プレイヤは、バイナリ数として数XI、XIが割り当てられています。ヒョードルをm + 1番目の選手である、の友達になるために選手のメートル番号の前に話をするように頼みました。2つの条件の友達になるk個以上ないと比較されている兵士の異なる数です。

 

アイデア:

異なるビット数をカウントするためです。そう考えXOR演算することができ、両方の部分同じ1が異なる部分となり、0になります。 

その後、我々はうまく番号1を数えることができます!

番号1をカウントするかのように、我々は考えることができ、この数1とビット単位のAND演算を。

 

この魔法のような気持ちの良いとの初めて!

 

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include < ストリング >
 4の#include <iostreamの>
 5の#include <STDLIB.H>
 6の#include <アルゴリズム>
 7  
8  使用して 名前空間STD。
9  のconst  int型 MAXN =  + 10 10  INT [MAXN]。
11  
12  
13  
14  のint main()の
 15  {
 16  #ifndefのONLINE_JUDGE
 17      freopenは("../in.txt " " R "STDIN);
 18 #endifの19 int型N、M、K;
 20 ながら(scanf関数(" %D%D%D "!、&N、&M、&K)= EOF)
 21     {
 22 のためにint型 i = 0 ; iがm <I ++は23              のscanf(" %dの"、および[I])
 24          のscanf(" %dの"、および[M]);
 25 INT ANS = 0  
                             26          のためにint型 I = 0 ; iが<M; iが++ 27          {
 28              INT TMP = A [I] ^ [M]。
29              int型 CNT = 0 30              のために(; TMP; TMP >> = 1 31              {
 32                  であれば(TMP&1 33                      CNT ++ 34              }
 35              であれば(CNT <= K)
 36の                  ANS ++ 37          }
 38         printf(" %d個の\ n " 、ANS)。
39      }
 40      リターン 0 41 }

 

おすすめ

転載: www.cnblogs.com/-Ackerman/p/11210747.html