#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=1e5+5;
ll ans; // 存储每组测试用例的最大连通分量大小
// 并查集(Union-Find)节点结构体:用于管理二进制位的连通关系
struct UF {
ll rank=0; // 秩,用于按秩合并,优化合并效率
UF* root; // 父节点指针,路径压缩时更新
ll cnt=0; // 当前连通分量包含的数字个数
};
vector<UF>a(64); // 最多64位二进制,每个位置对应一个并查集节点
// 并查集查找根节点(带路径压缩)
// 算法思想:递归查找根节点,同时将当前节点的父节点直接指向根,减少后续查询时间
UF* Root(UF* a){
if(a->root!=a){ // 非根节点时递归查找
a->root=Root(a->root); // 路径压缩:直接指向根节点
}
return a->root; // 返回根节点
}
// 并查集合并两个集合(按秩合并)
// 算法思想:将秩小的集合合并到秩大的集合下,减少树的高度;合并时更新连通分量大小,维护最大值ans
void merge(ll x, ll y) {
UF* rx = Root(&a[x]); // 找x对应位的根节点
UF* ry = Root(&a[y]); // 找y对应位的根节点
if (rx == ry) return; // 同一集合,无需合并
// 按秩合并:秩小的挂到秩大的下面
if (rx->rank < ry->rank) {
rx->root = ry; // rx的根指向ry
ry->cnt += rx->cnt; // 合并连通分量大小
ans = max(ry->cnt, ans); // 更新最大连通分量
}
else {
ry->root = rx; // ry的根指向rx
rx->cnt += ry->cnt; // 合并连通分量大小
ans = max(rx->cnt, ans); // 更新最大连通分量
if (rx->rank == ry->rank) { // 秩相同时,根节点秩+1
rx->rank++;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // 加速输入输出
ll T;
cin>>T;
while(T--){ // 处理多组测试用例
ll n;
cin>>n;
ans=0; // 每组测试用例初始化最大连通分量为0
a.clear();// 清空并查集容器
a.resize(64);
// 并查集初始化:每个二进制位的节点根指向自己
for(ll k=0;k<64;k++){
a[k].root=&a[k];
}
// 遍历每个数字,处理其二进制位的连通关系
for(ll i=1;i<=n;i++){
ll w;
cin>>w; // 输入当前数字的权重
ll pre=-1; // 记录当前数字的前一个有效二进制位
// 遍历64位二进制位,检查当前位是否为1
for(ll k=0;k<64;k++){
ll t=(1LL<<k); // 构造第k位的掩码(1左移k位)
if((t&w)>=1){ // 当前数字的第k位为1
if(pre==-1){// 第一个有效位:该位的连通分量计数+1
Root(&a[k])->cnt++;
ans=max(ans,Root(&a[k])->cnt); // 更新最大值
}else{ // 非第一个有效位:合并当前位与前一个有效位的集合
merge(k,pre);
}
pre=k; // 更新前一个有效位为当前位
}
}
}
cout<<ans<<'\n'; // 输出每组测试用例的最大连通分量大小
}
return 0;
}