• 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
    ", ans);
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    R 语言中的数据结构
    minimap2 长reads比对工具
    seqtk 一款快速处理fasta/fastq 文件的小程序
    Eclipse R语言开发环境搭建 StatET插件
    Windows 安装R
    HttpClient 发送请求和参数
    Java Base64编码和解码
    docker 安装
    docker
    inotify 监控文件系统操作
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6979081.html
Copyright © 2020-2023  润新知