[LOJ6087]毒瘤题

来源:互联网 发布:淘宝好吃的泡面排行榜 编辑:程序博客网 时间:2024/06/14 00:09

题目大意

找到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);    }}
原创粉丝点击