https://codeforces.com/contest/1300/problem/C
和昨晚这场的div2的B有异曲同工之妙。
思路:对每一个数位进行二进制位数的考虑。
f(x,y)=(x|y)−y
1 1 0 0
1 0 1 0
可以发现,只有在出现了x出现了一次1的时候,这个时候的位才不是0,不然其他三个情况这一位都是0.那么贪心去考虑哪个数字的最高位只出现了一次零。O(32n)枚举即可。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
LL a[maxn],b[40];
LL n;
void solve(LL x)
{
swap(a[1],a[x]);
for(LL i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
cin>>n;
for(LL i=1;i<=n;i++) cin>>a[i];
for(LL i=32;i>=1;i--)
{
for(LL j=1;j<=n;j++){
if(a[j]&(1<<(i-1))) b[i]++;
}
}
for(LL i=32;i>=1;i--)
{
if(b[i]!=1) continue;
for(LL j=1;j<=n;j++)
{
if(a[j]&(1<<(i-1)))
{
solve(j);
return 0;
}
}
}
solve(1);
return 0;
}