对于二进制串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
这样看起来不可过,实际上数据似乎很水。。。。
单然这题并没有给二进制串的范围,不好计算复杂度..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; }