#include "bits/stdc++.h"
using namespace std;
#define structure map<vector<int>, int>
#define FOR_MAP(ii,T) for(structure::iterator (ii)=(T).begin();(ii)!=(T).end();(ii)++)
#define FOR_next_MAP(jj,ii,T) for(structure::iterator (jj)=(ii);(jj)!=(T).end();(jj)++)
#define VI vector<int>
const int MIN_SUP = 2;
structure C;
structure L;
void C1();
void L1();
void generate_C();
void generate_L();
void output(structure );
void scan_D();
void prune();
bool check_compatibility(VI ,VI );
void set_count(VI );
int main(int argc, char const *argv[])
{
C.clear();
L.clear();
bool mv=true;
int index=2;
while(true)
{
if (mv)
{
C1();
cout<<"C1\n";
output(C);
L1();
cout<<"L1\n";
output(L);
mv=!mv;
}else
{
generate_C();
if(C.size()==0)
break;
cout<<"\nC"<<index<<"\n";
output(C);
prune();
if (C.size()==0)
{
break;
}
cout<<"\nC"<<index<<" after prune \n";
output(C);
scan_D();
cout<<"\nC"<<index<<"after scaning dataset \n";
output(C);
generate_L();
if (L.size()==0)
{
break;
}
cout<<"\nL"<<index<<"\n";
output(L);
index++;
}
}
return 0;
}
void C1()
{
ifstream fin;
fin.open("input.txt");
if(!fin)
{
cout<<"Input file opening error\n";
exit(0);
}
int n;
VI v;
while(fin>>n)
{
v.clear();
if (n==-1)
{
continue;
}
v.push_back(n);
if(C.count(v)>0)
C[v]++;
else
C[v]=1;
}
fin.close();
}
void output(structure T)
{
cout<<"\n";
VI v;
FOR_MAP(ii,T)
{
v.clear();
v=ii->first;
for (int i = 0; i < v.size(); ++i)
{
cout<<v[i]<<" ";
}
cout<<" ---(frequency)----->> "<<ii->second;
cout<<"\n";
}
}
void L1()
{
FOR_MAP(ii,C)
{
if (ii->second >= MIN_SUP)
{
L[ii->first]=ii->second;
}
}
}
void generate_C()
{
//clean(C);
C.clear();
FOR_MAP(ii,L)
{
FOR_next_MAP(jj,ii,L)
{
if(jj==ii)
continue;
VI a,b;
a.clear();
b.clear();
a=ii->first;
b=jj->first;
if(check_compatibility(a,b))
{
a.push_back(b.back());
sort(a.begin(), a.end());
C[a]=0;
}
}
}
}
bool check_compatibility(VI a,VI b)
{
bool compatible=true;
for (int i = 0; i < a.size()-1; ++i)
{
if (a[i]!=b[i])
{
compatible=false;
break;
}
}
return compatible;
}
void prune()
{
VI a,b;
FOR_MAP(ii,C)
{
a.clear();
b.clear();
a=ii->first;
for(int i = 0;i<a.size();i++)
{
b.clear();
for (int j = 0; j < a.size(); ++j)
{
if(j==i)
continue;
b.push_back(a[j]);
}
if(L.find(b)==L.end())
{
ii->second=-1;
break;
}
}
}
structure temp;
temp.clear();
FOR_MAP(ii,C)
{
if (ii->second != -1)
{
temp[ii->first]=ii->second;
}
}
C.clear();
C=temp;
temp.clear();
}
void scan_D()
{
ifstream fin;
fin.open("input.txt");
if(!fin)
{
cout<<"Input file opening error\n";
exit(0);
}
int n;
VI a;
while(fin>>n)
{
if(n==-1 && a.size()>0)
{
set_count(a);
a.clear();
}else if(n!=-1)
{
a.push_back(n);
}
}
fin.close();
}
void set_count(VI a)
{
FOR_MAP(ii,C)
{
VI b;
b.clear();
b=ii->first;
int true_count=0;
if (b.size()<=a.size())
{
for (int i = 0; i < b.size(); ++i)
{
for (int j = 0; j < a.size(); ++j)
{
if(b[i]==a[j])
{
true_count++;
break;
}
}
}
}
if (true_count==b.size())
{
ii->second++;
}
}
}
void generate_L()
{
L.clear();
FOR_MAP(ii,C)
{
if(ii->second >= MIN_SUP)
{
L[ii->first]=ii->second;
}
}
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBzdHJ1Y3R1cmUgbWFwPHZlY3RvcjxpbnQ+LCBpbnQ+CiNkZWZpbmUgRk9SX01BUChpaSxUKSBmb3Ioc3RydWN0dXJlOjppdGVyYXRvciAoaWkpPShUKS5iZWdpbigpOyhpaSkhPShUKS5lbmQoKTsoaWkpKyspCiNkZWZpbmUgRk9SX25leHRfTUFQKGpqLGlpLFQpIGZvcihzdHJ1Y3R1cmU6Oml0ZXJhdG9yIChqaik9KGlpKTsoamopIT0oVCkuZW5kKCk7KGpqKSsrKQojZGVmaW5lIFZJIHZlY3RvcjxpbnQ+Cgpjb25zdCBpbnQgTUlOX1NVUCA9IDI7CgpzdHJ1Y3R1cmUgQzsKc3RydWN0dXJlIEw7Cgp2b2lkIEMxKCk7CnZvaWQgTDEoKTsKdm9pZCBnZW5lcmF0ZV9DKCk7CnZvaWQgZ2VuZXJhdGVfTCgpOwp2b2lkIG91dHB1dChzdHJ1Y3R1cmUgKTsKdm9pZCBzY2FuX0QoKTsKdm9pZCBwcnVuZSgpOwpib29sIGNoZWNrX2NvbXBhdGliaWxpdHkoVkkgLFZJICk7CnZvaWQgc2V0X2NvdW50KFZJICk7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciBjb25zdCAqYXJndltdKQp7CglDLmNsZWFyKCk7CglMLmNsZWFyKCk7CgoJYm9vbCBtdj10cnVlOwoJaW50IGluZGV4PTI7Cgl3aGlsZSh0cnVlKQoJewoJCWlmIChtdikKCQl7CgkJCUMxKCk7CgkJCWNvdXQ8PCJDMVxuIjsKCQkJb3V0cHV0KEMpOwoKCQkJTDEoKTsKCQkJY291dDw8IkwxXG4iOwoJCQlvdXRwdXQoTCk7CgkJCQoJCQltdj0hbXY7CgkJfWVsc2UKCQl7CgkJCWdlbmVyYXRlX0MoKTsKCQkJaWYoQy5zaXplKCk9PTApCgkJCQlicmVhazsKCQkJY291dDw8IlxuQyI8PGluZGV4PDwiXG4iOwoJCQlvdXRwdXQoQyk7CgkJCXBydW5lKCk7CgkJCWlmIChDLnNpemUoKT09MCkKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJY291dDw8IlxuQyI8PGluZGV4PDwiIGFmdGVyIHBydW5lIFxuIjsKCQkJb3V0cHV0KEMpOwoJCQlzY2FuX0QoKTsKCQkJY291dDw8IlxuQyI8PGluZGV4PDwiYWZ0ZXIgc2NhbmluZyBkYXRhc2V0IFxuIjsKCQkJb3V0cHV0KEMpOwoJCQlnZW5lcmF0ZV9MKCk7CgkJCWlmIChMLnNpemUoKT09MCkKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJY291dDw8IlxuTCI8PGluZGV4PDwiXG4iOwoJCQlvdXRwdXQoTCk7CgkJCWluZGV4Kys7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCgp2b2lkIEMxKCkKewoJaWZzdHJlYW0gZmluOwoJZmluLm9wZW4oImlucHV0LnR4dCIpOwoJaWYoIWZpbikKCQl7CgkJCWNvdXQ8PCJJbnB1dCBmaWxlIG9wZW5pbmcgZXJyb3JcbiI7CgkJCWV4aXQoMCk7CgkJfQoKCWludCBuOwoJVkkgdjsKCXdoaWxlKGZpbj4+bikKCXsKCQl2LmNsZWFyKCk7CgkJaWYgKG49PS0xKQoJCXsKCQkJY29udGludWU7CgkJfQoJCXYucHVzaF9iYWNrKG4pOwoJCWlmKEMuY291bnQodik+MCkKCQkJQ1t2XSsrOwoJCWVsc2UKCQkJQ1t2XT0xOwoJfQoJZmluLmNsb3NlKCk7Cn0KCnZvaWQgb3V0cHV0KHN0cnVjdHVyZSBUKQp7Cgljb3V0PDwiXG4iOwoJVkkgdjsKCUZPUl9NQVAoaWksVCkKCXsKCQl2LmNsZWFyKCk7CgkJdj1paS0+Zmlyc3Q7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQoJCXsKCQkJY291dDw8dltpXTw8IiAiOwoJCX0KCgkJY291dDw8IiAtLS0oZnJlcXVlbmN5KS0tLS0tPj4gIjw8aWktPnNlY29uZDsKCQljb3V0PDwiXG4iOwoKCX0KfQoKdm9pZCBMMSgpCnsKCglGT1JfTUFQKGlpLEMpCgl7CgkJaWYgKGlpLT5zZWNvbmQgPj0gTUlOX1NVUCkKCQl7CgkJCUxbaWktPmZpcnN0XT1paS0+c2Vjb25kOwoJCX0KCX0KCn0KCnZvaWQgZ2VuZXJhdGVfQygpCnsKCS8vY2xlYW4oQyk7CglDLmNsZWFyKCk7CglGT1JfTUFQKGlpLEwpCgl7CgoJCUZPUl9uZXh0X01BUChqaixpaSxMKQoJCXsKCQkJaWYoamo9PWlpKQoJCQkJY29udGludWU7CgkJCVZJIGEsYjsKCQkJYS5jbGVhcigpOwoJCQliLmNsZWFyKCk7CgkJCWE9aWktPmZpcnN0OwoJCQliPWpqLT5maXJzdDsKCQkJaWYoY2hlY2tfY29tcGF0aWJpbGl0eShhLGIpKQkKCQkJewoJCQkJYS5wdXNoX2JhY2soYi5iYWNrKCkpOwoJCQkJc29ydChhLmJlZ2luKCksIGEuZW5kKCkpOwoJCQkJQ1thXT0wOwoJCQl9CgkJfQoKCX0KCgp9Cgpib29sIGNoZWNrX2NvbXBhdGliaWxpdHkoVkkgYSxWSSBiKQp7Cglib29sIGNvbXBhdGlibGU9dHJ1ZTsKCWZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCktMTsgKytpKQoJewoJCWlmIChhW2ldIT1iW2ldKQoJCXsKCQkJY29tcGF0aWJsZT1mYWxzZTsKCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiBjb21wYXRpYmxlOwp9Cgp2b2lkIHBydW5lKCkKewoJVkkgYSxiOwoJCglGT1JfTUFQKGlpLEMpCgl7CgkJYS5jbGVhcigpOwoJCWIuY2xlYXIoKTsKCgkJYT1paS0+Zmlyc3Q7CgkJZm9yKGludCBpID0gMDtpPGEuc2l6ZSgpO2krKykKCQl7CgkJCWIuY2xlYXIoKTsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhLnNpemUoKTsgKytqKQoJCQl7CgkJCQlpZihqPT1pKQoJCQkJCWNvbnRpbnVlOwoJCQkJYi5wdXNoX2JhY2soYVtqXSk7CgkJCX0KCQkJaWYoTC5maW5kKGIpPT1MLmVuZCgpKQoJCQkJewoJCQkJCWlpLT5zZWNvbmQ9LTE7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQoJCX0KCgkJfQoJc3RydWN0dXJlIHRlbXA7Cgl0ZW1wLmNsZWFyKCk7CglGT1JfTUFQKGlpLEMpCgl7CgkJaWYgKGlpLT5zZWNvbmQgIT0gLTEpCgkJewoJCQl0ZW1wW2lpLT5maXJzdF09aWktPnNlY29uZDsKCQl9Cgl9CgkJQy5jbGVhcigpOwoJQz10ZW1wOwoJdGVtcC5jbGVhcigpOwp9CnZvaWQgc2Nhbl9EKCkKewoJaWZzdHJlYW0gZmluOwoJZmluLm9wZW4oImlucHV0LnR4dCIpOwoJaWYoIWZpbikKCQl7CgkJCWNvdXQ8PCJJbnB1dCBmaWxlIG9wZW5pbmcgZXJyb3JcbiI7CgkJCWV4aXQoMCk7CgkJfQoJaW50IG47CglWSSBhOwoJd2hpbGUoZmluPj5uKQoJewoJCWlmKG49PS0xICYmIGEuc2l6ZSgpPjApCgkJewoJCQlzZXRfY291bnQoYSk7CgkJCWEuY2xlYXIoKTsKCQl9ZWxzZSBpZihuIT0tMSkKCQl7CgkJCWEucHVzaF9iYWNrKG4pOwoJCX0KCQkKCX0KCWZpbi5jbG9zZSgpOwp9CnZvaWQgc2V0X2NvdW50KFZJIGEpCnsKCUZPUl9NQVAoaWksQykKCXsKCQlWSSBiOwoJCWIuY2xlYXIoKTsKCQliPWlpLT5maXJzdDsKCQlpbnQgdHJ1ZV9jb3VudD0wOwoJCWlmIChiLnNpemUoKTw9YS5zaXplKCkpCgkJewoJCQlmb3IgKGludCBpID0gMDsgaSA8IGIuc2l6ZSgpOyArK2kpCgkJCXsKCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYS5zaXplKCk7ICsraikKCQkJCXsKCQkJCQlpZihiW2ldPT1hW2pdKQoJCQkJCXsKCQkJCQkJdHJ1ZV9jb3VudCsrOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCWlmICh0cnVlX2NvdW50PT1iLnNpemUoKSkKCQl7CgkJCWlpLT5zZWNvbmQrKzsKCQl9Cgl9Cn0KCnZvaWQgZ2VuZXJhdGVfTCgpCnsKCUwuY2xlYXIoKTsKCUZPUl9NQVAoaWksQykKCXsKCQlpZihpaS0+c2Vjb25kID49IE1JTl9TVVApCgkJewoJCQlMW2lpLT5maXJzdF09aWktPnNlY29uZDsKCQl9Cgl9Cn0KCiAgICAK