这题需要注意的是,当i和j不等的时候,可以算两对,但其实自己本身和自己也是可以算一对的(本蒟蒻被误导了),两个数字异或,这就使得当且仅当两个数字相等,才能使结果为0,显然,我们可以开一个数组cnt[N]来统计各个数字出现的次数,之后可以通过找规律的方式知道,当一个数字出现了n次,那么这个数字可以有n*n对组合,最后只用遍历每个数字加起来就行了。要注意储存答案开long long,否则n*n会爆。以下附上代码。
#include<bits/stdc++.h>
using namespace std;
long long cnt[200005];
int main()
{
    long long n;long long ans=0;long long maxx=0;
    cin>>n;
    memset(cnt,0,sizeof(cnt));
    while(n--)
    {
        long long k;
        cin>>k;
        cnt[k]++;
        if(maxx<k)maxx=k;//记录最大数字 
    }
    for(int i=0;i<=maxx;i++)
    {
    if(cnt[i])ans+=cnt[i]*cnt[i];
}
    cout<<ans<<endl;
}