题意:
求一个最大团,使得其中任意两个数的异或都比这俩数要小。
思路:
只要二进制位数一样,异或的值都比这俩数要小;
二分查找减少时间复杂度。
队友代码:
#include <bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;++i)
#define _rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long LL;
int a[32], T, n, x;
vector<int> vec;
void init()
{
vec.push_back(0);
_rep(i, 1, 30) vec.push_back(1 << i);
vec.push_back((1 << 31) - 1);
}
int main()
{
init();
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
memset(a, 0, sizeof(a));
int ans = 0;
_for(i, 0, n)
{
scanf("%d", &x);
int k = upper_bound(vec.begin(), vec.end(), x) - vec.begin();
++a[k];
}
_for(i, 0, 32) ans = max(ans, a[i]);
printf("%d\n", ans);
}
return 0;
}