zoj 3870

题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518

题意:n个数,从中选出两个数,问这两个数的异或值大于两个数较大的数的组合有多少种

题目分类:异或

代码

#include<bits/stdc++.h>

using namespace std;

const int MaxN = 1e5 + 10;
int a[MaxN], bit[50]; // bit[i]表示有多少个数的最高位的1在第i位上

void solve(int x) 
{
    int l = 31;
    while(l >= 0) 
    {
        if(x & (1<<l)) 
        {
            bit[l]++;
            return ;
        }
        l--;
    }
    return ;
}

int main() 
{
    int T, n;
    scanf("%d", &T);
    while(T--) 
    {
        scanf("%d", &n);
        memset(bit, 0, sizeof(bit));
        for(int i = 0; i < n; i++) 
        {
            scanf("%d", &a[i]);
            solve(a[i]);
        }
        int ans = 0;
        for(int i = 0; i < n; i++) 
        {
            int l = 31;
            while(l >= 0) 
            {
                if(a[i] & (1<<l)) break;
                l--;
            }
            while(l >= 0) 
            {
                if(!(a[i] & (1<<l))) ans += bit[l];
                l--;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2015-11-13 22:19  Gssol  阅读(200)  评论(0编辑  收藏  举报