ZOJ.3418 Binary Number【异或】 2015/09/22

来源:互联网 发布:电脑图片编辑软件 编辑:程序博客网 时间:2024/06/05 20:46

Binary Number

Time Limit: 2 Seconds      Memory Limit: 65536 KB

For 2 non-negative integers x and y, f(x, y) is defined as the number of different bits in the binary format ofx and y. For example, f(2, 3)=1, f(0, 3)=2, f(5, 10)=4.

Now given 2 sets of non-negative integers A and B, for each integerb in B, you should find an integer a in A such that f(a, b) is minimized. If there are more than one such integers in setA, choose the smallest one.

Input

The first line of the input is an integer T (0 < T ≤ 100), indicating the number of test cases. The first line of each test case contains 2 positive integersm and n (0 < m, n ≤ 100), indicating the numbers of integers of the 2 setsA and B, respectively. Then follow (m +n) lines, each of which contains a non-negative integers no larger than 1000000. The firstm lines are the integers in set A and the other n lines are the integers in setB.

Output

For each test case you should output n lines, each of which contains the result for each query in a single line.

Sample Input

22 512123455 21000000999914233421013245353

Sample Output

1211199990


Author: CAO, Peng
Source: The 2010 ACM-ICPC Asia Chengdu Regional Contest
暴力枚举,异或之后求其值二进制中1的个数。。。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int a[110],b[110],n,m,t;int binary(int i,int j){    int ret = b[i]^a[j];    int ans = 0;    while( ret ){        if( ret & 1 ) ans++;        ret>>=1;    }    return ans;}int main(){    cin>>t;    while(t--){        cin>>m>>n;        int i,j;        for( i = 0 ; i < m ; ++i )            scanf("%d",&a[i]);        for( i = 0 ; i < n ; ++i )            scanf("%d",&b[i]);        int flag,ret,ans;        for( i = 0 ; i < n ; ++i ){            flag=1000000,ret=1000000;            for( j = 0 ; j < m ; ++j ){                ans = binary(i,j);                if( ans < ret ){                    ret = ans;                    flag = a[j];                }                else if( ans == ret ){                    if( flag > a[j] )                        flag = a[j];                }            }            printf("%d\n",flag);        }    }    return 0;}


0 0
原创粉丝点击