您的位置:首页 > 其它

zoj 3870

2015-11-13 22:19 239 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: