题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4712
首先,算汉明距离就是二进制异或以后的1的个数,统计1的个数用x&=x-1很快很神奇。
用if(x&1) {count++; x>>=1;} 在位数比较多的时候会慢一些。
然后就是看题解学到的神奇的“随机”! 来取到“任意的两个” 1w次wa,但是10w次就不会,20组testcase ,不会超时;
真的ac了,很神奇
代码:
#include<iostream>
#include<ctime>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
using namespace std;
int a[100005];
int hamming(int x,int y)
{
x=x^y;
int count=0;
while(x)
{
x&=x-1;
count++;
}
return count;
}
int min(int &a,int &b)
{
return a<b?a:b;
}
int main()
{
int T;
cin>>T;
srand(time(0));
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
scanf("%x",&a[i]);
int test=100000;
int x,y;
int ans=100;
while(test--)
{
x=rand()%n;
y=rand()%n;
while(x==y)
x=rand()%n;
ans=min(ans,hamming(a[x],a[y]));
}
cout<<ans<<endl;
}
}