Submission #4891161


Source Code Expand

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) begin(x), end(x)
using namespace std;

vector<int> func(int n, int k) {
    default_random_engine gen;
    assert (k % 2 == 1);
    vector<int> p(1 << n);
    REP (i, 1 << n) {
        p[i] = (i ^ (i >> 1));
    }
    assert (__builtin_popcount(p.back()) == 1);
    while (__builtin_popcount(p.back()) < k) {
        int found = -1;
        double max_value = -1;
        REP3 (i, 1, 1 << n) {
            if (__builtin_popcount(p[i - 1] ^ p.back()) == 1 and __builtin_popcount(p[i]) > __builtin_popcount(p.back())) {
                assert (__builtin_popcount(p[i]) == __builtin_popcount(p.back()) + 2);
                double value = 1 + uniform_real_distribution<double>()(gen);
                if (max_value < value) {
                    max_value = value;
                    found = i;
                }
            }
            if (__builtin_popcount(p[i - 1] ^ p.back()) == 1 and __builtin_popcount(p[i]) == __builtin_popcount(p.back())) {
                double value = uniform_real_distribution<double>()(gen);
                if (max_value < value) {
                    max_value = value;
                    found = i;
                }
            }
        }
        assert (found != -1);
        reverse(p.begin() + found, p.end());
    }
    assert (__builtin_popcount(p.back()) == k);
    return p;
}

bool bit(int x, int i) {
    return x & (1 << i);
}

int swap_bits(int x, int i, int j) {
    if (bit(x, i) != bit(x, j)) {
        x ^= 1 << i;
        x ^= 1 << j;
    }
    return x;
}

vector<int> solve1(int n, int b) {
    int k = __builtin_popcount(b);
    if (k % 2 == 0) {
        return vector<int>();
    }
    vector<int> p = func(n, k);
    REP (i, 1 << n) {
        int c = p.back();
        REP (k1, n) {
            if (bit(c, k1) != bit(b, k1)) {
                REP (k2, n) if (k2 != k1) {
                    if (bit(c, k2) != bit(b, k2) and bit(c, k2) == bit(b, k1)) {
                        c = swap_bits(c, k1, k2);
                        p[i] = swap_bits(p[i], k1, k2);
                        break;
                    }
                }
            }
        }
        assert (c == b);
    }
    assert (p.front() == 0);
    assert (p.back() == b);
    return p;
}

vector<int> solve(int n, int a, int b) {
    vector<int> p = solve1(n, b ^ a);
    if (p.empty()) return p;
    REP (i, 1 << n) {
        p[i] ^= a;
    }
    return p;
}

int main() {
    int n, a, b; cin >> n >> a >> b;
    vector<int> p = solve(n, a, b);
    if (p.empty()) {
        cout << "NO" << endl;
    } else {
        cout << "YES" << endl;
        for (int p_i : p) {
            cout << p_i << ' ';
        }
        cout << endl;

        // check
        assert (p.front() == a);
        assert (p.back() == b);
        REP (i, (1 << n) - 1) {
            assert (__builtin_popcount(p[i] ^ p[i + 1]) == 1);
        }
    }
    return 0;
}

Submission Info

Submission Time
Task C - Differ by 1 Bit
User kimiyuki
Language C++14 (GCC 5.4.1)
Score 800
Code Size 3173 Byte
Status AC
Exec Time 36 ms
Memory 1536 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 2
AC × 51
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01-01.txt AC 1 ms 256 KiB
01-02.txt AC 1 ms 256 KiB
01-03.txt AC 1 ms 256 KiB
01-04.txt AC 1 ms 256 KiB
01-05.txt AC 1 ms 256 KiB
01-06.txt AC 1 ms 256 KiB
01-07.txt AC 1 ms 256 KiB
01-08.txt AC 1 ms 256 KiB
01-09.txt AC 1 ms 256 KiB
01-10.txt AC 1 ms 256 KiB
01-11.txt AC 1 ms 256 KiB
01-12.txt AC 1 ms 256 KiB
01-13.txt AC 1 ms 256 KiB
01-14.txt AC 1 ms 256 KiB
01-15.txt AC 1 ms 256 KiB
01-16.txt AC 1 ms 256 KiB
01-17.txt AC 1 ms 256 KiB
01-18.txt AC 1 ms 256 KiB
01-19.txt AC 1 ms 256 KiB
01-20.txt AC 1 ms 256 KiB
01-21.txt AC 1 ms 256 KiB
01-22.txt AC 2 ms 256 KiB
01-23.txt AC 1 ms 256 KiB
01-24.txt AC 3 ms 256 KiB
01-25.txt AC 1 ms 256 KiB
01-26.txt AC 4 ms 384 KiB
01-27.txt AC 1 ms 256 KiB
01-28.txt AC 7 ms 512 KiB
01-29.txt AC 1 ms 256 KiB
01-30.txt AC 14 ms 896 KiB
01-31.txt AC 1 ms 256 KiB
01-32.txt AC 25 ms 1536 KiB
01-33.txt AC 36 ms 1536 KiB
01-34.txt AC 28 ms 1536 KiB
01-35.txt AC 33 ms 1536 KiB
01-36.txt AC 33 ms 1536 KiB
01-37.txt AC 32 ms 1536 KiB
01-38.txt AC 28 ms 1536 KiB
01-39.txt AC 31 ms 1536 KiB
01-40.txt AC 26 ms 1536 KiB
01-41.txt AC 27 ms 1536 KiB
01-42.txt AC 31 ms 1536 KiB
01-43.txt AC 32 ms 1536 KiB
01-44.txt AC 33 ms 1536 KiB
01-45.txt AC 31 ms 1536 KiB
01-46.txt AC 28 ms 1536 KiB
01-47.txt AC 30 ms 1536 KiB
01-48.txt AC 27 ms 1536 KiB
01-49.txt AC 25 ms 1536 KiB
sample-01.txt AC 1 ms 256 KiB
sample-02.txt AC 1 ms 256 KiB