提交时间:2024-07-20 12:59:26
运行 ID: 30606
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1.1e6 + 9, M = 12600009, P = (1 << 20) - 1; #define Min(x, y) (x < y ? x : y) vector<int> G[M]; int dfn[N], low[N], scc[N], tot, cnt, sta[N], tp; void dfs(int u) { dfn[u] = low[u] = ++tot, sta[++tp] = u; for (int v : G[u]) { if (!dfn[v]) { dfs(v); low[u] = Min(low[u], low[v]); } else if (!scc[v]) { low[u] = Min(low[u], dfn[v]); } } if (dfn[u] == low[u]) { cnt++; int v; do { v = sta[tp--]; scc[v] = cnt; } while (v != u); } } int n, a[N], b[N], vis[N]; vector<int> v[N]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); vis[a[i]] = 1; } for (int i = 0; i <= P; i++) { if (vis[i]) G[i].push_back(i ^ P); for (int j = 0; j < 20; j++) { if (i & (1 << j)) G[i].push_back(i ^ (1 << j)); } } for (int i = 0; i <= P; i++) { if (!dfn[i]) dfs(i); } for (int i = 1; i <= n; i++) v[scc[a[i]]].push_back(i); for (int i = 1; i <= cnt; i++) { int m = v[i].size(); for (int j = 0; j < m; j++) b[j] = a[v[i][j]]; sort(b, b + m); for (int j = 0; j < m; j++) a[v[i][j]] = b[j]; } for (int i = 1; i <= n; i++) printf("%d ", a[i]); putchar('\n'); return 0; }