トピックへのリンク: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 }