#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+5;
void read(int &ret){ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';return ret;}
int nxt[N*30][2];
int siz[N*30];
int ss[N*30];
int sum[30][2];
int er[30],bit[30];
int cnt;
ll ans;
void add(int x)
{
int p=1;
for(int i=29;i>=0;i--)
{
int cur=x/er[i];
if(!nxt[p][cur])
nxt[p][cur]=++cnt;
int li,ri;
li=nxt[p][cur];
ri=nxt[p][cur^1];
if(ri)
ans+=1LL*(siz[ri]-1)*siz[ri]/2+1LL*siz[ri]*(sum[i][cur^1]-siz[ri])-ss[ri];
ss[li]+=sum[i][cur]-siz[li];
siz[p=li]++;
sum[i][cur]++;
x&=(er[i]-1);
}
}
int main()
{
for(int i=0;i<30;i++)er[i]=1<<i;
int t;
read(t);
while(t--)
{
int n;
read(n);
memset(nxt,0,sizeof(nxt));
memset(siz,0,sizeof(siz));
memset(sum,0,sizeof(sum));
memset(ss,0,sizeof(ss));
cnt=1;
ans=0;
for(int i=0;i<n;i++)
{
int x;
read(x),add(x);
}
printf("%I64d\n",ans);
}
}
hdu6059 字典树维护数位统计异或对数
最新推荐文章于 2017-09-05 11:30:21 发布