#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <vector>
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
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()
{
std::vector<std::vector<int>> data =
{
{1, 2, 3, 4, 5},
{1, 3, 4, 5},
{1, 2, 3, 5},
{1, 3}
};
std::map<std::set<int>, int> counts;
for (std::size_t Lsize = 1; Lsize <= 4; ++Lsize)
{
for (unsigned i = 0; i < data.size(); ++i)
{
std::size_t k = std::min(Lsize, data[i].size());
do
{
std::set<int> n_k(data[i].begin(), data[i].begin() + k);
++counts[n_k];
}
while (next_combination(data[i].begin(), data[i].begin() + k, data[i].end()));
}
}
for (const auto& p : counts)
{
std::cout << "{";
for (auto e : p.first) {
std::cout << e << " ";
}
std::cout << "} = " << p.second << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgppbmxpbmUgYm9vbCBuZXh0X2NvbWJpbmF0aW9uKGNvbnN0IEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBrLCBjb25zdCBJdGVyYXRvciBsYXN0KQp7CiAgICAvKiBDcmVkaXRzOiBUaG9tYXMgRHJhcGVyICovCiAgICBpZiAoKGZpcnN0ID09IGxhc3QpIHx8IChmaXJzdCA9PSBrKSB8fCAobGFzdCA9PSBrKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBJdGVyYXRvciBpdHIxID0gZmlyc3Q7CiAgICBJdGVyYXRvciBpdHIyID0gbGFzdDsKICAgICsraXRyMTsKICAgIGlmIChsYXN0ID09IGl0cjEpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgaXRyMSA9IGxhc3Q7CiAgICAtLWl0cjE7CiAgICBpdHIxID0gazsKICAgIC0taXRyMjsKICAgIHdoaWxlIChmaXJzdCAhPSBpdHIxKQogICAgewogICAgICAgIGlmICgqLS1pdHIxIDwgKml0cjIpCiAgICAgICAgewogICAgICAgICAgICBJdGVyYXRvciBqID0gazsKICAgICAgICAgICAgd2hpbGUgKCEoKml0cjEgPCAqaikpICsrajsKICAgICAgICAgICAgc3RkOjppdGVyX3N3YXAoaXRyMSwgaik7CiAgICAgICAgICAgICsraXRyMTsKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBpdHIyID0gazsKICAgICAgICAgICAgc3RkOjpyb3RhdGUoaXRyMSwgaiwgbGFzdCk7CiAgICAgICAgICAgIHdoaWxlIChsYXN0ICE9IGopCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICsrajsKICAgICAgICAgICAgICAgICsraXRyMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGQ6OnJvdGF0ZShrLCBpdHIyLCBsYXN0KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgc3RkOjpyb3RhdGUoZmlyc3QsIGssIGxhc3QpOwogICAgcmV0dXJuIGZhbHNlOwp9CgoKCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gZGF0YSA9CiAgICB7CiAgICAgICAgezEsIDIsIDMsIDQsIDV9LAogICAgICAgIHsxLCAzLCA0LCA1fSwKICAgICAgICB7MSwgMiwgMywgNX0sCiAgICAgICAgezEsIDN9CiAgICB9OwogICAgc3RkOjptYXA8c3RkOjpzZXQ8aW50PiwgaW50PiBjb3VudHM7CgogICAgZm9yIChzdGQ6OnNpemVfdCBMc2l6ZSA9IDE7IExzaXplIDw9IDQ7ICsrTHNpemUpCiAgICB7CiAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyArK2kpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OnNpemVfdCBrID0gc3RkOjptaW4oTHNpemUsIGRhdGFbaV0uc2l6ZSgpKTsKCiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGludD4gbl9rKGRhdGFbaV0uYmVnaW4oKSwgZGF0YVtpXS5iZWdpbigpICsgayk7CiAgICAgICAgICAgICAgICArK2NvdW50c1tuX2tdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChuZXh0X2NvbWJpbmF0aW9uKGRhdGFbaV0uYmVnaW4oKSwgZGF0YVtpXS5iZWdpbigpICsgaywgZGF0YVtpXS5lbmQoKSkpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBjb3VudHMpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ7IjsKICAgICAgICBmb3IgKGF1dG8gZSA6IHAuZmlyc3QpIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGUgPDwgIiAiOwogICAgICAgIH0KICAgICAgICBzdGQ6OmNvdXQgPDwgIn0gPSAiIDw8IHAuc2Vjb25kIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=