#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>

void print(
    const std::vector<bool>& flags,
    const std::vector<std::size_t>& zeros,
    const std::vector<std::size_t>& ones)
{
    auto it0 = zeros.begin();
    auto it1 = ones.begin();
    for (const auto& b : flags) {
        if (b) {
            std::cout << *it1++ << " ";
        } else {
            std::cout << *it0++ << " ";
        }
    }
    std::cout << std::endl;
}

void displayMapping(const std::vector<bool>& orig, const std::vector<bool>& target) {
    // same number of one
    assert(std::accumulate(orig.begin(), orig.end(), 0)
        == std::accumulate(target.begin(), target.end(), 0));
    // same number of zero
    assert(orig.size() == target.size());
    std::vector<std::size_t> zeros;
    std::vector<std::size_t> ones;
    for (std::size_t i = 0; i != target.size(); ++i) {
        if (target[i]) {
            ones.push_back(i);
        } else {
            zeros.push_back(i);
        }
    }

    do {
        do {
            print(orig, zeros, ones);
        } while (std::next_permutation(zeros.begin(), zeros.end()));
    } while (std::next_permutation(ones.begin(), ones.end()));
}

int main()
{
    displayMapping({0, 0, 0, 1, 1, 0, 1, 0}, {1, 1, 0, 0, 0, 0, 0, 1});
}
