题目
思路
这道题很像 “一个奇数次”。
我们要做的就是把一个奇数次的情况分类。
首先求所有数异或的答案,然后因为如果这个数的某个二进制位上是1的话,根据异或的定义,一定是两个不同的数位异或出来的,那么就可以用这一位分类做,每一类就是一个只有一个数字出现了奇数次的数列。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1000010],js;
int c,b;
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=1; i<=n; i++)
js^=a[i];
int x=0,now=0;
while(js)
{
x++;
if(js&1)
{
now=x;
break;
}
js>>=1;
}
for(int i=1; i<=n; i++)
{
if(a[i]&now)
c^=a[i];
else
b^=a[i];
}
if(c>b)
swap(c,b);
printf("%d %d",c,b);
return 0;
}