2013杭电warm up1 hdu 4712 Hamming Distance
题目地址: 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; } }