Wiki 2141(海明距离-异或值中1的个数)
来源:互联网 发布:知乎 努比亚z17和荣耀9 编辑:程序博客网 时间:2024/05/24 05:57
题目描述 Description
对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数。异或的规则为:
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0
计算两个串之间的海明距离的时候,他们的长度必须相同。现在我们给出N个不同的二进制串,请计算出这些串两两之间的最短海明距离。
输入描述 Input Description
第一个数字是整数T(T≤10),代表数据的组数。
接下来有T组数据,每组数据的第一行是一个正整数N,代表不同的二进制串的个数。接下来是N行,每行都是一个二进制串。我们用数字(0-9)和字符(A-F)来表示这个二进制串。它代表这个二进制串的16进制码。例如,“12345”代表的二进制串为“00010010001101000101”。
输出描述 Output Description
对于每个数据,请输出一个整数,即答案值。
样例输入 Sample Input
2
2
12345
54321
4
12345
6789A
BCDEF
0137F
样例输出 Sample Output
6
7
数据范围及提示 Data Size & Hint
本题有一个奇怪的写法:暴力枚举a1^a2的值对于30%的数据有1≤N≤100
对于全部数据,有1≤N≤100000
这样看起来不可过,实际上数据似乎很水。。。。
单然这题并没有给二进制串的范围,不好计算复杂度..O(n*2^len) len=数的二进制长度
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>#include<map>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define MAXN (10000000+10)long long mul(long long a,long long b){return (a*b)%F;}long long add(long long a,long long b){return (a+b)%F;}long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}typedef long long ll;int T,n;ll a[MAXN];char s[MAXN];int h[MAXN];ll change(char *s){ll x=0;Rep(i,strlen(s)){if (isdigit(s[i])) x=x*16+s[i]-'0';else x=x*16+s[i]-'A'+10;}return x;}bool dfs(ll t,int j,int l,int siz){if (l==siz+1){/*if (t==286820){cout<<'a';}*/For(i,n) if (h[a[i]^t]==T) return 1;//cout<<t<<' ';return 0;}for(int i=j+1,bin=(ll)1<<i;i<=20;bin=(ll)1<<++i){if (dfs(t+bin,i,l+1,siz)) return 1;}return 0;}int main(){//freopen("wiki2141.in","r",stdin);scanf("%d",&T);for(;T;T--){scanf("%d",&n);bool b=0;For(i,n) {scanf("%s",s+1),a[i]=change(s+1);if (h[a[i]]==T) {b=1;printf("0/n");for(i++;i<=n;i++) scanf("%*s");break;}h[a[i]]=T;}if (b) continue;int ans=1;//cout<<(a[1]^a[2])<<endl;//cout<<h[a[1]];while (1){if (dfs(0,-1,1,ans)) break;ans++;//cout<<ans<<endl;}printf("%d\n",ans);}return 0;}
- Wiki 2141(海明距离-异或值中1的个数)
- leetcode_461. Hamming Distance 计算汉明距离,按位异或运算,计算整数的二进制表示中1的个数 java
- 1的个数 汉明距离
- 算法-从1,...,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值
- 求二进制数中0或1的个数
- 二进制下异或运算与二进制数中1个数的奇偶性联系
- 牛客 题库 统计二进制数中1或0的个数
- 查询数据库中所有用户表或表的个数
- 找出给定数组或文件中最小的k个数
- n个数中任意两个异或最大值
- 从一亿个数中找出最大的一万个数或最小的一万个数
- 求N!阶乘中结尾0的个数,或结果的二进制表示中最后一个1所在的位置
- 求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 【GPU开发笔记】二:CUDA初探——查询设备
- C# 里面的 #region 是什么意思 以及partial 作用
- Jrebel 热加载插件
- BAPI调用 - 创建po的bapi BAPI_PO_CREATE1
- 数组作为函数参数
- Wiki 2141(海明距离-异或值中1的个数)
- 星期一的一天
- 小试Bean Validation
- LeetCode - Subsets
- Gerrit与Git安装及使用手册
- HDU 3033
- JS 实现Table相同行的单元格自动合并
- TI 6678第二天 cfg文件 cmd文件 ccxml文件
- thinkphp RBAC模型学习笔记