Problem p03097 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define int long long

bool check(vector<int> v) {
  for (int i = 0; i + 1 < (int)v.size(); i++) {
    if (__builtin_popcount(v[i] ^ v[i + 1]) != 1) {
      return false;
    }
  }
  return true;
}

vector<int> genka(int n, int a, int b) {
  if (n == 1) {
    return {a, b};
  }
  assert(__builtin_popcount(a ^ b) & 1);
  int ca = (a >> (n - 1)) & 1;
  int cb = (b >> (n - 1)) & 1;
  if (ca != cb) {
    int wb = 0;
    if (ca) {
      a ^= (1 << (n - 1));
      b ^= (1 << (n - 1));
      wb = 1;
    }
    for (int mid = 0; mid < (1 << (n - 1)); mid++) {
      if (__builtin_popcount(mid ^ a) % 2 == 0)
        continue;
      if (__builtin_popcount((1 << (n - 1)) ^ mid ^ b) % 2 == 0)
        continue;
      {
        vector<int> f = genka(n - 1, a, mid);
        vector<int> s = genka(n - 1, mid, b ^ (1 << (n - 1)));
        for (auto t : s) {
          f.push_back(t ^ (1 << (n - 1)));
        }
        if (wb) {
          for (auto &t : f) {
            t ^= (1 << (n - 1));
          }
        }
        return f;
      }
    }
  } else {
    int wb = 0;
    if (ca) {
      a ^= (1 << (n - 1));
      b ^= (1 << (n - 1));
      wb = 1;
    }
    vector<int> f = genka(n - 1, a, b);
    {
      int i = 0;
      int x = f[i];
      int y = f[i + 1];
      vector<int> s = genka(n - 1, x, y);
      vector<int> ans = {f[0]};
      for (auto t : s) {
        ans.push_back(t ^ (1 << (n - 1)));
      }
      for (int j = 1; j < (int)f.size(); j++) {
        ans.push_back(f[j]);
      }
      if (wb) {
        for (auto &t : ans) {
          t ^= (1 << (n - 1));
        }
      }
      return ans;
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  int n, a, b;
  cin >> n >> a >> b;
  int dt = a ^ b;
  if (!(__builtin_popcount(dt) & 1)) {
    cout << "NO\n";
  }
  cout << "YES\n";
  vector<int> ans = genka(n, a, b);
  for (auto t : ans) {
    cout << t << ' ';
  }
  cout << endl;
  // for (int i = 0; i < (1 << n); i++) {
  //     for (int j = 0; j < (1 << n); j++) {
  //         if (__builtin_popcount(i ^ j) & 1) genka(n, i, j);
  //     }
  // }
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define int long long

bool check(vector<int> v) {
  for (int i = 0; i + 1 < (int)v.size(); i++) {
    if (__builtin_popcount(v[i] ^ v[i + 1]) != 1) {
      return false;
    }
  }
  return true;
}

vector<int> genka(int n, int a, int b) {
  if (n == 1) {
    return {a, b};
  }
  assert(__builtin_popcount(a ^ b) & 1);
  int ca = (a >> (n - 1)) & 1;
  int cb = (b >> (n - 1)) & 1;
  if (ca != cb) {
    int wb = 0;
    if (ca) {
      a ^= (1 << (n - 1));
      b ^= (1 << (n - 1));
      wb = 1;
    }
    for (int mid = 0; mid < (1 << (n - 1)); mid++) {
      if (__builtin_popcount(mid ^ a) % 2 == 0)
        continue;
      if (__builtin_popcount((1 << (n - 1)) ^ mid ^ b) % 2 == 0)
        continue;
      {
        vector<int> f = genka(n - 1, a, mid);
        vector<int> s = genka(n - 1, mid, b ^ (1 << (n - 1)));
        for (auto t : s) {
          f.push_back(t ^ (1 << (n - 1)));
        }
        if (wb) {
          for (auto &t : f) {
            t ^= (1 << (n - 1));
          }
        }
        return f;
      }
    }
  } else {
    int wb = 0;
    if (ca) {
      a ^= (1 << (n - 1));
      b ^= (1 << (n - 1));
      wb = 1;
    }
    vector<int> f = genka(n - 1, a, b);
    {
      int i = 0;
      int x = f[i];
      int y = f[i + 1];
      vector<int> s = genka(n - 1, x, y);
      vector<int> ans = {f[0]};
      for (auto t : s) {
        ans.push_back(t ^ (1 << (n - 1)));
      }
      for (int j = 1; j < (int)f.size(); j++) {
        ans.push_back(f[j]);
      }
      if (wb) {
        for (auto &t : ans) {
          t ^= (1 << (n - 1));
        }
      }
      return ans;
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  int n, a, b;
  cin >> n >> a >> b;
  int dt = a ^ b;
  if (!(__builtin_popcount(dt) & 1)) {
    cout << "NO\n";
    exit(0);
  }
  cout << "YES\n";
  vector<int> ans = genka(n, a, b);
  for (auto t : ans) {
    cout << t << ' ';
  }
  cout << endl;
  // for (int i = 0; i < (1 << n); i++) {
  //     for (int j = 0; j < (1 << n); j++) {
  //         if (__builtin_popcount(i ^ j) & 1) genka(n, i, j);
  //     }
  // }
}