#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 100010;
typedef long long LL;
int t,n;
int q[N];
LL s[N],c[30][N];
int main(void)
{
scanf("%d",&t);
while(t--)
{
int n;scanf("%d",&n);
// s[i] 存储区间异或和
// c[j][i] 表示区间内1的数量
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i]);
s[i] = s[i-1]^(LL)q[i];
for(int j=0;j<30;j++)
// 取1的操作
c[j][i] = c[j][i-1]+(s[i]>>j&1);
}
LL ans=0;
for(int i=1;i<=n;i++)
{
int k=29;
// 这里要找到y最大的1的位置在哪
while(k>=0&&(q[i]>>k&1)==0) k--;
if(k<0) continue;
ans+=(c[k][n]-c[k][i-1])*(c[k][i-1]);
ans+=(n-i+1-(c[k][n]-c[k][i-1]))*(i-c[k][i-1]);
}
printf("%lld\n",ans);
}
return 0;
}
感谢查看!