提交时间:2024-07-19 13:41:08

运行 ID: 30404

#include <bits/stdc++.h> // #pragma GCC optimize("Ofast,unroll-loops,inline") using namespace std; // #pragma GCC optimize(3) // #define int long long #define endl "\n" int n; int a[2100300]; vector<int>g[2100300]; vector<int>loc[2100300]; vector<int>w[2100300]; const int N=(1<<20)-1; const int LG=20; int dfn[2100300],low[2100300]; int tp; int tk=0,cnt=0; int bel[2100300]; int S[2100300]; int hd[2100000]; struct node{int v,nxt;}E[1000030*20+2000000]; int ec=0; inline void ins(int u,int v){ ++ec; E[ec]={v,hd[u]}; hd[u]=ec; } inline void mn(int &x,int y){ if(x>y)x=y; } inline void dfs(int u){ dfn[u]=low[u]=++tk; S[++tp]=u; for(int i=hd[u];i;i=E[i].nxt){ int v=E[i].v; if(!dfn[v])dfs(v),mn(low[u],low[v]); else if(!bel[v])mn(low[u],dfn[v]); } // if(dfn[u]==low[u]){ // ++cnt; // while(tp){ // int x=S[tp]; // tp--; // bel[x]=cnt; // if(x==u)break; // } // } } signed main(){ ios::sync_with_stdio(0); // freopen("seq.in","r",stdin); // freopen("seq.out","w",stdout); for(int i=1;i<=N;i++) for(int j=0;j<LG;j++) if((i>>j)&1) ins(i,i^(1<<j)); scanf("%d ",&n); for(int i=1;i<=n;i++) scanf("%d" ,&a[i]); for(int i=1;i<=n;i++) ins(i+N,N^a[i]),ins(a[i],N+i); dfs(N); for(int i=1;i<=n;i++) loc[bel[i+N]].emplace_back(i), w[bel[i+N]].emplace_back(a[i]); for(int i=1;i<=cnt;i++){ sort(loc[i].begin(),loc[i].end()); sort(w[i].begin(),w[i].end()); int k=loc[i].size(); for(int j=0;j<k;j++) a[loc[i][j]]=w[i][j]; } for(int i=1;i<=n;i++) printf("%d ",a[i]); cout.flush(); return 0; }