Wiki 2141(海明距离-异或值中1的个数)

来源:互联网 发布:知乎 努比亚z17和荣耀9 编辑:程序博客网 时间:2024/05/24 05:57

对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数。异或的规则为:

0 XOR 0 = 0

1 XOR 0 = 1

0 XOR 1 = 1

1 XOR 1 = 0

       计算两个串之间的海明距离的时候,他们的长度必须相同。现在我们给出N个不同的二进制串,请计算出这些串两两之间的最短海明距离。

 

 

第一个数字是整数T(T≤10),代表数据的组数。

接下来有T组数据,每组数据的第一行是一个正整数N,代表不同的二进制串的个数。接下来是N行,每行都是一个二进制串。我们用数字(0-9)和字符(A-F)来表示这个二进制串。它代表这个二进制串的16进制码。例如,“12345”代表的二进制串为“00010010001101000101”。

对于每个数据,请输出一个整数,即答案值。

 

2

2

12345

54321

4

12345

6789A

BCDEF

0137F

6

7

对于30%的数据有1≤N≤100

对于全部数据,有1≤N≤100000

本题有一个奇怪的写法:暴力枚举a1^a2的值

这样看起来不可过,实际上数据似乎很水。。。。

单然这题并没有给二进制串的范围,不好计算复杂度..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;}




原创粉丝点击