[LOJ6087] 毒瘤题

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");
}
原文地址:https://www.cnblogs.com/mollnn/p/13716447.html