异或(按位枚举位运算,十分美妙的错题,带我千百遍刷之熟练之!)
分析:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 55; int n; int cnt[N];//统计数组 int main() { int T,x,b; scanf("%d",&T); while (T--)//样例数T { scanf("%d",&n);//每个样例有n个数 memset(cnt,0,sizeof(cnt)); //异或运算(^)对于+是满足结合律的。 a1^x+a2^x+a3^x == (a1+a2+a3)^x. //按位枚举,统计x的二进制形式中在各个数位上1的个数来嘞! for(int i=0;i<n;i++) { scanf("%d",&x);//颇有意味。 for(int i=0;i<=30;i++) { if(x&(1<<i)) cnt[i]++; } } long long ans=0; for(int i=0;i<=30;i++) {//同则泯灭为0,异则得生为1. 好巧妙地题目! ans+=1LL*min(cnt[i],n-cnt[i])*(1<<i); } printf("%lld\n", ans); } return 0; }
REF:https://blog.csdn.net/idrey/article/details/53869954