提交时间:2024-07-19 16:17:59
运行 ID: 30493
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=3e6+10; const int maxm=(1<<20)-1; ll n,m,t,k,cnt=0,tot=0,root,ans[maxn]; ll belong[maxn],a[maxn],dfn[maxn],low[maxn],fa[maxn]; int stk[maxn],tp=0; vector<ll> q[maxn],location[maxn],value[maxn]; int find_root(int x){ if(fa[x]==x) return x; return fa[x]=find_root(fa[x]); } void dfs(int pos){ dfn[pos]=low[pos]=++tot; stk[++tp]=pos; int siz=q[pos].size(); for(int i=0;i<siz;i++){ //cout<<pos<<" "<<i<<endl; int v=q[pos][i]; if(!dfn[v]){ dfs(v); low[pos]=min(low[pos],low[v]); } else if(!belong[maxn]){ low[pos]=min(low[pos],dfn[v]); } } if(dfn[pos]==low[pos]){ ++cnt; while(tp){ int y=stk[tp--]; belong[y]=cnt; if(y==pos) return; } } } int main(){ //freopen("seq.in","r",stdin); // freopen("seq.out","w",stdout); scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } if(n<=2000){ // cout<<1<<endl; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++){ for(int j=1;j<i;j++){ if((a[i]&a[j])!=0) continue; // cout<<a[i]<<" "<<a[j]<<endl; int fi=find_root(i),fj=find_root(j); if(fi!=fj) fa[fi]=fj; } } for(int i=1;i<=n;i++){ for(int j=1;j<i;j++){ // cout<<find_root(a[j])<<" "<<find_root(a[i])<<endl; if(a[j]>a[i]&&find_root(j)==find_root(i)) swap(a[i],a[j]); } } for(int i=1;i<=n;i++) printf("%lld ",a[i]); return 0; } for(int i=1;i<=maxm;i++){ for(int j=0;j<20;j++){ if((i>>j)&1){ q[i].push_back(i^(1<<j)); } } } for(int i=1;i<=n;i++){ q[i+maxm].push_back(a[i]^maxm); q[a[i]].push_back(i+maxm); } dfs(maxm); for(int i=1;i<=n;i++){ location[belong[i+maxm]].push_back(i); value[belong[i+maxm]].push_back(a[i]); } for(int i=1;i<=cnt;i++){ sort(location[i].begin(),location[i].end()); sort(value[i].begin(),value[i].end()); int siz=location[i].size(); for(int j=0;j<siz;j++){ ans[location[i][j]]=value[i][j]; } } for(int i=1;i<=n;i++) printf("%lld ",ans[i]); //fclose(stdin); // fclose(stdout); return 0; }