Description
从集合中找出 (k le 2) 个出现了奇数次的正整数 (a),保证恰好有 (k) 个符合条件的正整数。(n le 3 imes 10^6),内存限制 (4MB)。
Solution
一个数的情况很好处理,异或一下即可。考虑两个数的情况怎么办。
假设出现奇数次的数是 (a,b),那么所有数字异或起来的结果一定是 (c = a oplus b)。
对每个二进制位维护 (w[i]),当读入一个 (x) 且 (x) 的第 (j) 位是 (1) 的时候,就将 (w[j]) 异或上 (x)。
对于 (c) 为 (1) 的最高位,(a,b) 的这一位一定不同,假设这是第 (j) 位,那么 (w[j]) 一定是其中的一个数。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int k,n,w[32],a,b,c,x;
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
while(n--)
{
cin>>x;
for(int i=31;i>=0;--i)
{
if((x>>i)&1)
{
w[i]^=x;
}
}
c^=x;
}
for(int i=31;i>=0;--i)
{
if((c>>i)&1)
{
a=w[i];
break;
}
}
b=a^c;
if(k==1)
{
cout<<c<<endl;
}
else
{
if(a>b) swap(a,b);
cout<<a<<" "<<b<<endl;
}
system("pause");
}