#include <array>
#include <bitset>
#include <iostream>
template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
for (std::size_t i = 0; i != bs.size(); ++i) {
if (bs.flip(i).test(i) == true) {
return true;
}
}
return false; // overflow
}
template <typename T, std::size_t N>
void display(const std::array<T, N>& a, const std::bitset<N>& bs)
{
std::cout << '{';
const char* sep = "";
for (std::size_t i = 0; i != bs.size(); ++i) {
if (bs.test(i)) {
std::cout << sep << a[i];
sep = ", ";
}
}
std::cout << '}' << std::endl;
}
template <typename T, std::size_t N>
void display_all_subsets(const std::array<T, N>& a)
{
std::bitset<N> bs;
do {
display(a, bs);
} while (increase(bs));
}
int main()
{
const std::array<int, 3> a = {1, 2, 3};
display_all_subsets(a);
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KYm9vbCBpbmNyZWFzZShzdGQ6OmJpdHNldDxOPiYgYnMpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gYnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAoYnMuZmxpcChpKS50ZXN0KGkpID09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOyAvLyBvdmVyZmxvdwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4Kdm9pZCBkaXNwbGF5KGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4mIGEsIGNvbnN0IHN0ZDo6Yml0c2V0PE4+JiBicykKewogICAgc3RkOjpjb3V0IDw8ICd7JzsKICAgIGNvbnN0IGNoYXIqIHNlcCA9ICIiOwoKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gYnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAoYnMudGVzdChpKSkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc2VwIDw8IGFbaV07CiAgICAgICAgICAgIHNlcCA9ICIsICI7CiAgICAgICAgfQogICAgfQogICAgc3RkOjpjb3V0IDw8ICd9JyA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgp2b2lkIGRpc3BsYXlfYWxsX3N1YnNldHMoY29uc3Qgc3RkOjphcnJheTxULCBOPiYgYSkKewogICAgc3RkOjpiaXRzZXQ8Tj4gYnM7CgogICAgZG8gewogICAgICAgIGRpc3BsYXkoYSwgYnMpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UoYnMpKTsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OmFycmF5PGludCwgMz4gYSA9IHsxLCAyLCAzfTsKICAgIGRpc3BsYXlfYWxsX3N1YnNldHMoYSk7CgogICAgcmV0dXJuIDA7Cn0=