#include <iostream>
#include <vector>
using namespace std;
void print(std::vector<int> const &input){
std::cout << '{';
for (int i = 0; i < input.size(); i++) {
std::cout << input.at(i);
if (i < input.size() - 1)
std::cout << ", ";
}
std::cout << '}';
}
void printMany(std::vector< std::vector<int> > const &input)
{
std::cout << '{';
for (int i = 0; i < input.size(); i++) {
print(input.at(i));
if (i < input.size() - 1)
std::cout << ", ";
}
std::cout << '}';
std::cout << '\n';
}
void printPairs(std::vector< std::vector<int> > const &input)
{
for (int i = 0; i < input.size(); i+=2) {
cout << '{';
print(input.at(i));
cout << ", ";
print(input.at(i + 1));
cout << "}\n";
}
}
std::vector< std::vector<int> > f(std::vector<int> const &A, int i, const std::vector<int> &left, const std::vector<int> &right) {
if (i == A.size() - 1 && right.empty())
return std::vector< std::vector<int> >{left, std::vector<int> {A[i]}};
if (i == A.size())
return std::vector< std::vector<int> > {left, right};
std::vector<int> _left{ left };
_left.emplace_back(A[i]);
std::vector< std::vector<int> > result = f(A, i + 1, _left, right);
std::vector<int> _right{ right };
_right.emplace_back(A[i]);
std::vector< std::vector<int> > result1 = f(A, i + 1, left, _right);
result.insert( result.end(), result1.begin(), result1.end() );
return result;
}
std::vector< std::vector<int> > powerset(std::vector<int> const &A, const vector<int>& prefix = vector<int>(), int i = 0) {
if (i == A.size())
return std::vector< std::vector<int> > {prefix};
std::vector<int> _prefix(prefix);
_prefix.emplace_back(A[i]);
std::vector< std::vector<int> > result = powerset(A, _prefix, i + 1);
std::vector< std::vector<int> > result1 = powerset(A, prefix, i + 1);
result.insert( result.end(), result1.begin(), result1.end() );
return result;
}
int main() {
std::vector<int> A{0, 1, 2};
std::vector< std::vector<int> > ps = powerset(A);
cout << "Powerset:\n";
printMany(ps);
cout << "\nResult:\n";
for (int i=0; i<ps.size(); i++){
if (ps.at(i).size() > 1){
std::vector<int> left{ps.at(i)[0]};
std::vector<int> right;
printPairs(f(ps.at(i), 1, left, right));
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBwcmludChzdGQ6OnZlY3RvcjxpbnQ+IGNvbnN0ICZpbnB1dCl7CiAgICAgIHN0ZDo6Y291dCA8PCAneyc7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKCQlzdGQ6OmNvdXQgPDwgaW5wdXQuYXQoaSk7CiAgICAgICAgaWYgKGkgPCBpbnB1dC5zaXplKCkgLSAxKQogICAgICAgICAgc3RkOjpjb3V0IDw8ICIsICI7CiAgICAgIH0KICAgICAgc3RkOjpjb3V0IDw8ICd9JzsKfQp2b2lkIHByaW50TWFueShzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8aW50PiA+IGNvbnN0ICZpbnB1dCkKewogICAgc3RkOjpjb3V0IDw8ICd7JzsKCWZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKICAgICAgcHJpbnQoaW5wdXQuYXQoaSkpOwogICAgICBpZiAoaSA8IGlucHV0LnNpemUoKSAtIDEpCiAgICAgICAgc3RkOjpjb3V0IDw8ICIsICI7Cgl9CiAgICBzdGQ6OmNvdXQgPDwgJ30nOwogICAgc3RkOjpjb3V0IDw8ICdcbic7Cn0Kdm9pZCBwcmludFBhaXJzKHN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxpbnQ+ID4gY29uc3QgJmlucHV0KQp7Cglmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSs9MikgewogICAgICBjb3V0IDw8ICd7JzsKICAgICAgcHJpbnQoaW5wdXQuYXQoaSkpOwogICAgICBjb3V0IDw8ICIsICI7CiAgICAgIHByaW50KGlucHV0LmF0KGkgKyAxKSk7CiAgICAgIGNvdXQgPDwgIn1cbiI7Cgl9Cn0KIApzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8aW50PiA+IGYoc3RkOjp2ZWN0b3I8aW50PiBjb25zdCAmQSwgaW50IGksIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gJmxlZnQsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gJnJpZ2h0KSB7CiAgaWYgKGkgPT0gQS5zaXplKCkgLSAxICYmIHJpZ2h0LmVtcHR5KCkpCiAgICByZXR1cm4gc3RkOjp2ZWN0b3I8IHN0ZDo6dmVjdG9yPGludD4gPntsZWZ0LCBzdGQ6OnZlY3RvcjxpbnQ+IHtBW2ldfX07CiAgaWYgKGkgPT0gQS5zaXplKCkpCiAgICByZXR1cm4gc3RkOjp2ZWN0b3I8IHN0ZDo6dmVjdG9yPGludD4gPiB7bGVmdCwgcmlnaHR9OwogCiAgc3RkOjp2ZWN0b3I8aW50PiBfbGVmdHsgbGVmdCB9OwogIF9sZWZ0LmVtcGxhY2VfYmFjayhBW2ldKTsKICBzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8aW50PiA+IHJlc3VsdCA9IGYoQSwgaSArIDEsIF9sZWZ0LCByaWdodCk7CiAgc3RkOjp2ZWN0b3I8aW50PiBfcmlnaHR7IHJpZ2h0IH07CiAgX3JpZ2h0LmVtcGxhY2VfYmFjayhBW2ldKTsKICBzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8aW50PiA+IHJlc3VsdDEgPSBmKEEsIGkgKyAxLCBsZWZ0LCBfcmlnaHQpOwogIHJlc3VsdC5pbnNlcnQoIHJlc3VsdC5lbmQoKSwgcmVzdWx0MS5iZWdpbigpLCByZXN1bHQxLmVuZCgpICk7CiAgcmV0dXJuIHJlc3VsdDsKfQogCnN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxpbnQ+ID4gcG93ZXJzZXQoc3RkOjp2ZWN0b3I8aW50PiBjb25zdCAmQSwgY29uc3QgdmVjdG9yPGludD4mIHByZWZpeCA9IHZlY3RvcjxpbnQ+KCksIGludCBpID0gMCkgewogIGlmIChpID09IEEuc2l6ZSgpKQogICAgcmV0dXJuIHN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxpbnQ+ID4ge3ByZWZpeH07CgogIHN0ZDo6dmVjdG9yPGludD4gX3ByZWZpeChwcmVmaXgpOwogIF9wcmVmaXguZW1wbGFjZV9iYWNrKEFbaV0pOwogIHN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxpbnQ+ID4gcmVzdWx0ID0gcG93ZXJzZXQoQSwgX3ByZWZpeCwgaSArIDEpOwogIHN0ZDo6dmVjdG9yPCBzdGQ6OnZlY3RvcjxpbnQ+ID4gcmVzdWx0MSA9IHBvd2Vyc2V0KEEsIHByZWZpeCwgaSArIDEpOwogIHJlc3VsdC5pbnNlcnQoIHJlc3VsdC5lbmQoKSwgcmVzdWx0MS5iZWdpbigpLCByZXN1bHQxLmVuZCgpICk7CiAgcmV0dXJuIHJlc3VsdDsKfQogCmludCBtYWluKCkgewogIHN0ZDo6dmVjdG9yPGludD4gQXswLCAxLCAyfTsKICBzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8aW50PiA+IHBzID0gcG93ZXJzZXQoQSk7CiAgY291dCA8PCAiUG93ZXJzZXQ6XG4iOwogIHByaW50TWFueShwcyk7CiAgY291dCA8PCAiXG5SZXN1bHQ6XG4iOwogIGZvciAoaW50IGk9MDsgaTxwcy5zaXplKCk7IGkrKyl7CiAgICBpZiAocHMuYXQoaSkuc2l6ZSgpID4gMSl7CiAgICAgIHN0ZDo6dmVjdG9yPGludD4gbGVmdHtwcy5hdChpKVswXX07CiAgICAgIHN0ZDo6dmVjdG9yPGludD4gcmlnaHQ7CiAgICAgIHByaW50UGFpcnMoZihwcy5hdChpKSwgMSwgbGVmdCwgcmlnaHQpKTsKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0K
Powerset:
{{0, 1, 2}, {0, 1}, {0, 2}, {0}, {1, 2}, {1}, {2}, {}}
Result:
{{0, 1}, {2}}
{{0, 2}, {1}}
{{0}, {1, 2}}
{{0}, {1}}
{{0}, {2}}
{{1}, {2}}