cf769D(枚举&位或运算)

题目链接:http://codeforces.com/problemset/problem/769/D

 

题意:求给出的 n 个数中有多少对数字的二进制形式恰好有 k 位不同

 

思路:两个数a, b的二进制形式恰好 k 位不同即 a ^ b 中 1 的个数,那么可以枚举.注意 n 为 1e5 枚举 ai 会tle,不过 ai 的范围是 1e4,显然有大量重复的元素;

可以先去重并记录每个元素出现的次数,再枚举每个元素即可;

 

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #define ll long long
 4 using namespace std;
 5 
 6 const int MAXN = 1e5 + 10;
 7 ll a[MAXN], vis[MAXN];
 8 
 9 int BitCount(unsigned int n){//求 n 二进制中 1 的数目
10     unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
11     return ((tmp + (tmp >> 3)) & 030707070707) % 63;
12 }
13 
14 int main(void){
15     int n, k, x, indx = 0;
16     ll ans = 0;
17     scanf("%d%d", &n, &k);
18     for(int i = 0; i < n; i++){
19         scanf("%d", &x);
20         if(!vis[x]) a[indx++] = x;
21         vis[x]++;
22     }
23     for(int i = 0; i < indx; i++){
24         if(k == 0){
25             ans += (vis[a[i]] - 1) * vis[a[i]] / 2;
26             continue;
27         }
28         for(int j = i + 1; j < indx; j++){
29             int cnt = a[i] ^ a[j];
30             if(k == BitCount(cnt)) ans += vis[a[i]] * vis[a[j]];
31         }
32     }
33     printf("%lld\n", ans);
34     return 0;
35 }
View Code

 

转载于:https://www.cnblogs.com/geloutingyu/p/6979081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值