#include <bits/stdc++.h> using namespace std; #define ll unsigned long long #define fo(i,a,b) for(int i=a;i<b;i++) vector<ll>a(64); int find(int x){ if(a[x]!=x){ a[x]=find(a[x]); } return a[x]; } void arrage_sum(int x,int y){ x=find(x); y=find(y); if(x!=y){ a[x]=a[y]; } } int main() { ll n; cin>>n; while(n--){ ll m; cin>>m; vector<vector<int>>vv(64);//记录0到63位上为一的数的下标; vector<ll>v(m); fo(i,0,64)a[i]=i;//初始化并查集 fo(i,0,m){ cin>>v[i]; vector<ll>b;//记录每个数的二进制位数为一的数 for(int j=0;j<64;j++){ if((v[i]>>j)&1){ vv[j].emplace_back(i); b.emplace_back(j); } } if(b.size()>1){ fo(k,1,b.size()){ arrage_sum(b[k-1],b[k]); } } } fo(i,0,64){ int x=find(i); if(x!=i){ fo(j,0,vv[i].size()){ vv[x].emplace_back(vv[i][j]); } sort(vv[x].begin(),vv[x].end()); } } int ans=0; fo(i,0,64){ ll flag=0; if(vv[i].size()>1){ fo(j,1,vv[i].size()){ if(vv[i][j]==vv[i][j-1]){ flag++; } } } ans=max(ans,int(vv[i].size()-flag)); } // fo(i,0,64)cout<<a[i]<<" "; // fo(i,0,64){ // fo(j,0,vv[i].size()){ // cout<<vv[i][j]<<" "; // } // cout<<'\n'; // } cout<<ans<<'\n'; } return 0; } // 64 位输出请用 printf("%lld")
本体