#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k,
const Iterator last) {
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1) {
if (*--itr1 < *itr2) {
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1, j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1, j, last);
while (last != j) {
++j;
++itr2;
}
std::rotate(k, itr2, last);
return true;
}
}
std::rotate(first, k, last);
return false;
}
int main() {
vector<int> combo = {1, 2, 3, 3, 3, 4, 5};
sort(combo.begin(), combo.end());
auto end = unique(combo.begin(), combo.end());
auto begin = combo.begin();
auto mid = begin + 3;
do {
for (auto iter = begin; iter != mid; ++iter)
cout << *iter << " ";
cout << endl;
}
while (next_combination(begin, mid, end));
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CmlubGluZSBib29sIG5leHRfY29tYmluYXRpb24oY29uc3QgSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSXRlcmF0b3IgbGFzdCkgewogICAgaWYgKChmaXJzdCA9PSBsYXN0KSB8fCAoZmlyc3QgPT0gaykgfHwgKGxhc3QgPT0gaykpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIEl0ZXJhdG9yIGl0cjEgPSBmaXJzdDsKICAgIEl0ZXJhdG9yIGl0cjIgPSBsYXN0OwogICAgKytpdHIxOwoKICAgIGlmIChsYXN0ID09IGl0cjEpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGl0cjEgPSBsYXN0OwogICAgLS1pdHIxOwogICAgaXRyMSA9IGs7CiAgICAtLWl0cjI7CgogICAgd2hpbGUgKGZpcnN0ICE9IGl0cjEpIHsKICAgICAgICBpZiAoKi0taXRyMSA8ICppdHIyKSB7CiAgICAgICAgICAgIEl0ZXJhdG9yIGogPSBrOwoKICAgICAgICAgICAgd2hpbGUgKCEoKml0cjEgPCAqaikpICsrajsKCiAgICAgICAgICAgIHN0ZDo6aXRlcl9zd2FwKGl0cjEsIGopOwogICAgICAgICAgICArK2l0cjE7CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgaXRyMiA9IGs7CiAgICAgICAgICAgIHN0ZDo6cm90YXRlKGl0cjEsIGosIGxhc3QpOwoKICAgICAgICAgICAgd2hpbGUgKGxhc3QgIT0gaikgewogICAgICAgICAgICAgICAgKytqOwogICAgICAgICAgICAgICAgKytpdHIyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RkOjpyb3RhdGUoaywgaXRyMiwgbGFzdCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIHN0ZDo6cm90YXRlKGZpcnN0LCBrLCBsYXN0KTsKICAgIHJldHVybiBmYWxzZTsKICAgIH0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gY29tYm8gPSB7MSwgMiwgMywgMywgMywgNCwgNX07CiAgICBzb3J0KGNvbWJvLmJlZ2luKCksIGNvbWJvLmVuZCgpKTsKICAgIGF1dG8gZW5kID0gdW5pcXVlKGNvbWJvLmJlZ2luKCksIGNvbWJvLmVuZCgpKTsKICAgIGF1dG8gYmVnaW4gPSBjb21iby5iZWdpbigpOwogICAgYXV0byBtaWQgPSBiZWdpbiArIDM7CgogICAgZG8gewogICAgICAgIGZvciAoYXV0byBpdGVyID0gYmVnaW47IGl0ZXIgIT0gbWlkOyArK2l0ZXIpCiAgICAgICAgICAgIGNvdXQgPDwgKml0ZXIgPDwgIiAiOwoKICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgfQogICAgd2hpbGUgKG5leHRfY29tYmluYXRpb24oYmVnaW4sIG1pZCwgZW5kKSk7CiAgICB9Cg==