建图,定义62个虚点,分别表示第i位上是否是1,然后遍历所有数,将其连向对应的虚点。

最后进行dfs即可。

需要注意的一个细节是虚点不能被计入答案,需要减去这部分。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int const N = 2e5+9;
int const inf = 1e9+7;
int n;
int w[N];
vector<int> v[N];
int vis[N];
int tot = 0,ans = 0;
int p(int j)
{
	return n + j + 1;
}

void dfs(int x)
{
	tot++;
	vis[x] = 1;
	for(auto to : v[x])
	{
		if(vis[to]) continue;
		dfs(to);
	}
	return;
}

void solve()
{
	tot = ans = 0;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=62;j++)
		{
			if((w[i] >> j) & 1)
			{
				int b = p(j);
				v[b].push_back(i);
				v[i].push_back(b);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		dfs(i);
		for(int j=0;j<=62;j++)
		{
			if(vis[p(j)])
			{
				tot--;
				vis[p(j)] = 0;
			}
		}
		ans = max(ans,tot);
		tot = 0;
		
	}
	cout<<ans<<endl;
	for(int i=1;i<=n;i++) v[i].clear(),vis[i] = 0;
	for(int j=0;j<=62;j++) vis[p(j)] = 0,v[p(j)].clear();
	return;
}
signed main()
{
	int T;cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

/*
1 1
2 2 + 1
3 3 + 2 +1

*/