#牛客春招刷题训练营# + 链接
题意显然是并查集维护size,但是n平方复杂度是不对的
从and考虑按位遍历,稍微注意下细节
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN=100010;
ll w[MAXN];
int fa[MAXN], sum[MAXN];
inline int find(int x) {
if(x != fa[x]) {
int t = fa[x];
fa[x] = find(fa[x]);
}
return fa[x];
}
inline void merge(int x, int y) {
x = find(x);
y = find(y);
if(x != y) {
fa[x] = y;
sum[y] += sum[x];
}
}
int main() {
int T,n;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i=1;i<=n;i++) {
scanf("%lld", w+i);
fa[i]=i;
sum[i]=1;
}
vector<int> ve;
for (int k=0;k<=60;k++) {
for (int i=1;i<=n;i++) if ((w[i]>>k)&1) {
ve.push_back(i);
}
for (int i=1;i<ve.size();i++) {
merge(ve[0], ve[i]);
}
ve.clear();
}
printf("%d\n", *max_element(sum+1,sum+n+1));
}
return 0;
}



京公网安备 11010502036488号