建图,定义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
*/

京公网安备 11010502036488号