#牛客春招刷题训练营# + 链接

题意显然是并查集维护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;
}