リンク:https://codeforces.com/contest/1300/problem/C
アヌは、彼女自身の機能FFを作成しました:F(X、Y)=(X | Y)-yf(X、Y)=(X | Y)-y || 意味 ビットごとのOR演算を。例えば、F(11,6)=(11 | 6)-6 = 15-6 = 9F(11,6)=(11 | 6)-6 = 15-6 = 9。任意の非負の数がxxをおよびFのYY値(X、Y)は、f(x、y)はまた、非負であることを証明することができます。
彼女は、この関数の詳細を研究したいと自分のために複数の問題を作成しました。しかし、彼女はそれらのすべてを解決することができず、あなたの助けを必要とします。ここでは、これらの問題の一つです。
配列の値は[A1、A2、...、] [A1、A2、...、]は、F(F(... F(F(A1、A2)、A3のように定義される)、...-1)、 )、F(F(... F(F(A1、A2)、A3)、...-1)、)(注を参照)。あなたは必ずしも区別できない要素を持つ配列を与えています。配列の値が可能極大となるように、どのようにその要素の順序を変更する必要がありますか?
入力
最初の行は、単一の整数NN(1≤n≤1051≤n≤105)を含みます。
2行目はNN整数A1、A2、...、ANA1、A2、...、(0≤ai≤1090≤ai≤109)が含まれています。配列の要素は異なることが保証されていません。
出力
整数NN出力、最大値を持つ配列の並べ替え。複数回答がある場合は、いずれかを印刷してください。
例
入力
コピー
4 4 0 11 6
出力
コピー
11 6 4 0
入力
コピー
1 13
出力
コピー
13
注意
最初のテストケース、アレイの値[11,6,4,0] [11,6,4,0]はF(F(F(11,6)、4)、0)である= F(F(9 、4)、0)= F(9,0)= 9F(F(F(11,6)、4)、0)= F(F(9,4)、0)= F(9,0)= 9。
[11,4,0,6] [11,4,0,6]も有効な回答です。
#include<bits/stdc++.h>
using namespace std;
long long n,t,s,k,max1;
struct node{
int s[100];
int x;
int sum;
int id;
}a[200005];
bool cmp(node q,node g)
{
int k1=q.sum;
int k2=g.sum;
while(q.s[k1]==g.s[k2]&&k1>1&&k2>1)
{
k1--;
k2--;
}
if(q.s[k1]!=g.s[k2])
return q.s[k1]>g.s[k2];
else
return q.sum>g.sum;
}
map<long long,long long>m;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x;
k=a[i].x;
int j=1;
while(k)
{
if(k%2==1)
{
m[j]++;
}
k/=2;
j++;
}
}
max1=0;
for(int i=1;i<=n;i++)
{
k=a[i].x;
int j=1,p=0;
while(k)
{
if(k%2==1)
{
if(m[j]==1)
{
p++;
a[i].s[p]=j;
}
}
k/=2;
j++;
}
a[i].sum=p;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
cout<<a[i].x<<" ";
}
}