#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <fstream>
#include <strstream>
#include <sstream>
#include <utility>
#include <map>
#include <list>
#include <set>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <iterator>
using namespace std;
int threshold = 3;
std::map <int, set<int>> Ls;
std::size_t Msize = 0, temp = 0;
std::size_t MCsize=0, temp2 = 0;
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}
};
/*
in my program, I calculte Msize as:
Msize = std::distance(std::istream_iterator<std::string>(Sline1),
std::istream_iterator<std::string>());
if (temp > Msize)
Msize = temp;
else
temp = Msize;
*/
Msize =5;
int j = 0;
std::size_t k = 0;
std::map<std::set<int>, int> counts;
for (std::size_t Lsize = 1; Lsize <= Msize; ++Lsize)
{
for (unsigned i = 0; i < data.size(); ++i)
{
//std::size_t k = std::min(Lsize, data[i].size());
if (Lsize > data[i].size())
continue;
else
k = Lsize;
do
{
std::set<int> n_k(data[i].begin(), data[i].begin() + k);
if (Ls.size() != 0)
{
std::map <int, set<int>> ::iterator ls2 = Ls.begin();
while (ls2 != Ls.end())
{
if (std::includes(n_k.begin(), n_k.end(), ls2->second.begin(), ls2->second.end()))
{
++j;
Ls[j].insert(n_k.begin(), n_k.end());
goto ncom;
}
else
++ls2;
}
}
++counts[n_k];
ncom:
cout << ""; // If I don't put this statement I will get error: missing {
} while (next_combination(data[i].begin(), data[i].begin() + k, data[i].end()));
}
MCsize = counts.size();
if (temp2 == MCsize) // check if counts don't have more supset > threshold, then no needs to generate more superset
goto stop;
else
temp2 = MCsize;
std::map<std::set<int>, int> ::iterator current = counts.begin();
while (current != counts.end())
{
if (current->second < threshold)
{
Ls[j].insert(current->first.begin(), current->first.end());
current = counts.erase(current);
++j;
}
else
++current;
}
}
stop:
for (const auto& p : counts)
{
std::cout << "{";
for (auto e : p.first) {
std::cout << e << " ";
}
std::cout << "} = " << p.second << std::endl;
}
data.clear();
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4gCiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHN0ZGxpYi5oPgojaW5jbHVkZTxzdHJpbmcuaD4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxzdHJzdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgdGhyZXNob2xkID0gMzsKc3RkOjptYXAgPGludCwgc2V0PGludD4+IExzOwpzdGQ6OnNpemVfdCBNc2l6ZSA9IDAsIHRlbXAgPSAwOwpzdGQ6OnNpemVfdCBNQ3NpemU9MCwgdGVtcDIgPSAwOwogCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KaW5saW5lIGJvb2wgbmV4dF9jb21iaW5hdGlvbihjb25zdCBJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgaywgY29uc3QgSXRlcmF0b3IgbGFzdCkKewovKiBDcmVkaXRzOiBUaG9tYXMgRHJhcGVyICovCmlmICgoZmlyc3QgPT0gbGFzdCkgfHwgKGZpcnN0ID09IGspIHx8IChsYXN0ID09IGspKQpyZXR1cm4gZmFsc2U7Ckl0ZXJhdG9yIGl0cjEgPSBmaXJzdDsKSXRlcmF0b3IgaXRyMiA9IGxhc3Q7CisraXRyMTsKaWYgKGxhc3QgPT0gaXRyMSkKcmV0dXJuIGZhbHNlOwppdHIxID0gbGFzdDsKLS1pdHIxOwppdHIxID0gazsKLS1pdHIyOwp3aGlsZSAoZmlyc3QgIT0gaXRyMSkKewppZiAoKi0taXRyMSA8ICppdHIyKQp7Ckl0ZXJhdG9yIGogPSBrOwp3aGlsZSAoISgqaXRyMSA8ICpqKSkgKytqOwpzdGQ6Oml0ZXJfc3dhcChpdHIxLCBqKTsKKytpdHIxOworK2o7Cml0cjIgPSBrOwpzdGQ6OnJvdGF0ZShpdHIxLCBqLCBsYXN0KTsKd2hpbGUgKGxhc3QgIT0gaikKeworK2o7CisraXRyMjsKfQpzdGQ6OnJvdGF0ZShrLCBpdHIyLCBsYXN0KTsKcmV0dXJuIHRydWU7Cn0KfQpzdGQ6OnJvdGF0ZShmaXJzdCwgaywgbGFzdCk7CnJldHVybiBmYWxzZTsKfQogCiAKIGludCBtYWluKCkKewoJIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IGRhdGEgPQp7CnsxLCAyLCAzLCA0LCA1fSwKezEsIDMsIDQsIDV9LAp7MSwgMiwgMywgNX0sCnsxLCAzfQp9OwoKLyoKaW4gbXkgcHJvZ3JhbSwgSSBjYWxjdWx0ZSBNc2l6ZSBhczoKTXNpemUgPSBzdGQ6OmRpc3RhbmNlKHN0ZDo6aXN0cmVhbV9pdGVyYXRvcjxzdGQ6OnN0cmluZz4oU2xpbmUxKSwKCQkJc3RkOjppc3RyZWFtX2l0ZXJhdG9yPHN0ZDo6c3RyaW5nPigpKTsKCgkJaWYgKHRlbXAgPiBNc2l6ZSkKCQkJTXNpemUgPSB0ZW1wOwoJCWVsc2UKCQkJdGVtcCA9IE1zaXplOwoqLwpNc2l6ZSA9NTsgCglpbnQgaiA9IDA7CglzdGQ6OnNpemVfdCBrID0gMDsKCXN0ZDo6bWFwPHN0ZDo6c2V0PGludD4sIGludD4gY291bnRzOwoKCWZvciAoc3RkOjpzaXplX3QgTHNpemUgPSAxOyBMc2l6ZSA8PSBNc2l6ZTsgKytMc2l6ZSkKCXsKCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7ICsraSkKCQl7CgkJCS8vc3RkOjpzaXplX3QgayA9IHN0ZDo6bWluKExzaXplLCBkYXRhW2ldLnNpemUoKSk7CgkJCWlmIChMc2l6ZSA+ICBkYXRhW2ldLnNpemUoKSkKCQkJCWNvbnRpbnVlOwoJCQllbHNlCgkJCQkgayA9IExzaXplOwoKCQkJZG8KCQkJewoJCQkJc3RkOjpzZXQ8aW50PiBuX2soZGF0YVtpXS5iZWdpbigpLCBkYXRhW2ldLmJlZ2luKCkgKyBrKTsKCgkJCQlpZiAoTHMuc2l6ZSgpICE9IDApCgkJCQl7CgkJCQkJc3RkOjptYXAgPGludCwgc2V0PGludD4+IDo6aXRlcmF0b3IgbHMyID0gTHMuYmVnaW4oKTsKCgkJCQkJd2hpbGUgKGxzMiAhPSBMcy5lbmQoKSkKCQkJCQl7CgkJCQkJCWlmIChzdGQ6OmluY2x1ZGVzKG5fay5iZWdpbigpLCBuX2suZW5kKCksIGxzMi0+c2Vjb25kLmJlZ2luKCksIGxzMi0+c2Vjb25kLmVuZCgpKSkKCQkJCQkJewoJCQkJCQkJKytqOwoJCQkJCQkJTHNbal0uaW5zZXJ0KG5fay5iZWdpbigpLCBuX2suZW5kKCkpOwoJCQkJCQkJZ290byBuY29tOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJKytsczI7CgkJCQkJfQoJCQkJfQoJCQkJCSsrY291bnRzW25fa107CgkJCQluY29tOgoJCQkJCWNvdXQgPDwgIiI7IC8vIElmIEkgZG9uJ3QgcHV0IHRoaXMgc3RhdGVtZW50ICBJIHdpbGwgZ2V0IGVycm9yOiBtaXNzaW5nIHsKCQkJfSB3aGlsZSAobmV4dF9jb21iaW5hdGlvbihkYXRhW2ldLmJlZ2luKCksIGRhdGFbaV0uYmVnaW4oKSArIGssIGRhdGFbaV0uZW5kKCkpKTsKCgkJfQoKCgkJTUNzaXplID0gY291bnRzLnNpemUoKTsKCQlpZiAodGVtcDIgPT0gTUNzaXplKSAvLyBjaGVjayBpZiBjb3VudHMgZG9uJ3QgaGF2ZSBtb3JlIHN1cHNldCA+IHRocmVzaG9sZCwgdGhlbiBubyBuZWVkcyB0byBnZW5lcmF0ZSAgbW9yZSBzdXBlcnNldAoJCQlnb3RvIHN0b3A7CgkJZWxzZQoJCQl0ZW1wMiA9IE1Dc2l6ZTsKCgkJc3RkOjptYXA8c3RkOjpzZXQ8aW50PiwgaW50PiA6Oml0ZXJhdG9yIGN1cnJlbnQgPSBjb3VudHMuYmVnaW4oKTsKCQkKCQl3aGlsZSAoY3VycmVudCAhPSBjb3VudHMuZW5kKCkpCgkJewoJCQlpZiAoY3VycmVudC0+c2Vjb25kIDwgdGhyZXNob2xkKQoJCQl7CgkJCQlMc1tqXS5pbnNlcnQoY3VycmVudC0+Zmlyc3QuYmVnaW4oKSwgY3VycmVudC0+Zmlyc3QuZW5kKCkpOwoJCQkJY3VycmVudCA9IGNvdW50cy5lcmFzZShjdXJyZW50KTsKCQkJCSsrajsKCQkJfQoJCQllbHNlCgkJCQkrK2N1cnJlbnQ7CgkJfQoKCQl9CgoKCXN0b3A6Cglmb3IgKGNvbnN0IGF1dG8mIHAgOiBjb3VudHMpCgl7CgkJc3RkOjpjb3V0IDw8ICJ7IjsKCQlmb3IgKGF1dG8gZSA6IHAuZmlyc3QpIHsKCQkJc3RkOjpjb3V0IDw8IGUgPDwgIiAiOwoJCX0KCQlzdGQ6OmNvdXQgPDwgIn0gPSAiIDw8IHAuc2Vjb25kIDw8IHN0ZDo6ZW5kbDsKCX0KCgkJCglkYXRhLmNsZWFyKCk7CgoJCgoKCgkKCXJldHVybiAwOwp9CgoKCg==