http://acm.hdu.edu.cn/showproblem.php?pid=4712
题目大意:
n个16进制数 任选两个异或 求异或结果二进制中1的最少个数
分析:
随机数法 没见过
AC代码:
#include <bits/stdc++.h>
#define lowbit(x) (x&-x)
#define gcd(a,b) __gcd(a,b)
#define mset(a,x) memset(a,x,sizeof(a))
#define FIN freopen("input","r",stdin)
#define FOUT freopen("output","w",stdout)
const int INF=0x3f3f3f3f;
const double pi=acos(-1.0);
const double esp=1e-6;
const int MAX=1e5+10;
const int mod=1e9+7;
typedef long long ll;
using namespace std;
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
inline ll inv1(ll b){return qpow(b,mod-2);}
inline ll inv2(ll b){return b==1?1:(mod-mod/b)*inv2(mod%b)%mod;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int a[1000005];
int judge(int x){
int sum=0;
while (x){
if (x&1) sum++;
x>>=1;
}
return sum;
}
int main (){
int t;
scanf ("%d",&t);
while (t--){
int n;
scanf ("%d",&n);
for (int i=0;i<n;i++) scanf ("%X",&a[i]);
srand(time(0));
int ans=INF;
for (int i=0;i<1000005;i++){
int index1=rand()%n;
int index2=rand()%n;
while (index1==index2) index2=rand()%n;
ans=min(ans,judge(a[index1]^a[index2]));
}
printf ("%d\n",ans);
}
return 0;
}