题目大意
找到k个出现次数为奇数的数,保证只有k个数出现奇数次。
做法
k=1全部异或起来。
k=2保存一个c[i]表示第i位上是1的数的异或和。
得到a^b,找到最高位k,那么c[k]是其中一个,然后能得到另一个。
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxd=32;
int c[40];
int i,j,k,l,t,n,m,a,b,ans,last;
int main(){
scanf("%d%d",&n,&m);
fo(i,1,n){
scanf("%d",&t);
k=t;
fo(j,0,maxd-1){
if (k%2==1) c[j]^=t;
k/=2;
}
ans^=t;
}
if (m==1) printf("%d\n",ans);
else{
k=ans;
fo(j,0,maxd-1){
if (k%2==1) last=j;
k/=2;
}
a=c[last];
b=ans^a;
if (a>b) swap(a,b);
printf("%d %d\n",a,b);
}
}