CodeForces-1361C.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct Step {
  4. int edge;
  5. int from;
  6. int to;
  7. };
  8. int main() {
  9. ios::sync_with_stdio(false);
  10. cin.tie(nullptr);
  11. int n;
  12. cin >> n;
  13. vector<int> a(n), b(n);
  14. for (int i = 0; i < n; ++i) cin >> a[i] >> b[i];
  15. for (int bits = 20; bits >= 0; --bits) {
  16. int vertices = 1 << bits;
  17. int mask = vertices - 1;
  18. vector<vector<pair<int, int>>> graph(vertices);
  19. vector<int> degree(vertices, 0);
  20. for (int i = 0; i < n; ++i) {
  21. int u = a[i] & mask;
  22. int v = b[i] & mask;
  23. graph[u].push_back({v, i});
  24. graph[v].push_back({u, i});
  25. ++degree[u];
  26. ++degree[v];
  27. }
  28. bool possible = true;
  29. int start = a[0] & mask;
  30. for (int v = 0; v < vertices; ++v) {
  31. if (degree[v] & 1) possible = false;
  32. if (degree[v] != 0) start = v;
  33. }
  34. if (!possible) continue;
  35. vector<int> iterator(vertices, 0);
  36. vector<char> used(n, false);
  37. vector<int> vertex_stack{start};
  38. vector<Step> entering;
  39. vector<Step> tour;
  40. while (!vertex_stack.empty()) {
  41. int v = vertex_stack.back();
  42. while (iterator[v] < static_cast<int>(graph[v].size())
  43. && used[graph[v][iterator[v]].second]) {
  44. ++iterator[v];
  45. }
  46. if (iterator[v] == static_cast<int>(graph[v].size())) {
  47. vertex_stack.pop_back();
  48. if (!entering.empty()) {
  49. tour.push_back(entering.back());
  50. entering.pop_back();
  51. }
  52. continue;
  53. }
  54. auto [to, edge] = graph[v][iterator[v]++];
  55. if (used[edge]) continue;
  56. used[edge] = true;
  57. vertex_stack.push_back(to);
  58. entering.push_back({edge, v, to});
  59. }
  60. if (static_cast<int>(tour.size()) != n) continue;
  61. reverse(tour.begin(), tour.end());
  62. cout << bits << '\n';
  63. for (const Step &step : tour) {
  64. int left = 2 * step.edge + 1;
  65. int right = 2 * step.edge + 2;
  66. if ((a[step.edge] & mask) != step.from) swap(left, right);
  67. cout << left << ' ' << right << ' ';
  68. }
  69. cout << '\n';
  70. return 0;
  71. }
  72. }