#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <set>
#include <algorithm>
static int NowSeqS = 0;
struct StrSeq {
std::string str;
int index;
StrSeq(std::string s) : str(s), index(-1) {}
};
bool operator<(StrSeq a, StrSeq b) { return a.str < b.str; }
std::ostream &operator<<(std::ostream &s, StrSeq ob) {
s << ob.str;
return s;
}
void set_grouping(std::vector<StrSeq> &input, std::vector<std::vector<StrSeq>> &output) {
std::vector<std::set<StrSeq> *> sets;
for (auto &s : input) {
std::string g1x, g2x;
std::stringstream ss(s.str);
getline(ss, g1x, '=');
getline(ss, g2x);
StrSeq g1 = StrSeq(g1x);
StrSeq g2 = StrSeq(g2x);
/*-------------------------------------*/
std::set<StrSeq> *g1_in_set = nullptr;
std::set<StrSeq> *g2_in_set = nullptr;
/* g1 */
for (auto p : sets) {
auto q = (*p).find(g1);
if (q != (*p).end())
g1_in_set = p;
}
/* g2 */
for (auto p : sets) {
auto q = (*p).find(g2);
if (q != (*p).end()) {
if (g1_in_set == p)
continue;
g2_in_set = p;
}
}
/*-------------------------------------*/
if (g1_in_set == nullptr && g2_in_set == nullptr) {
g1.index = NowSeqS++;
g2.index = NowSeqS++;
std::set<StrSeq> *p = new std::set<StrSeq>();
(*p).insert(g1);
(*p).insert(g2);
sets.push_back(p);
} else if (g1_in_set != nullptr && g2_in_set == nullptr) {
g2.index = NowSeqS++;
(*g1_in_set).insert(g2);
} else if (g1_in_set == nullptr && g2_in_set != nullptr) {
g1.index = NowSeqS++;
(*g2_in_set).insert(g1);
} else if (g1_in_set != g2_in_set) {
for (auto g : *g2_in_set)
(*g1_in_set).insert(g);
for (auto p = sets.begin(); p != sets.end(); p++) {
if (*p == g2_in_set) {
sets.erase(p);
break;
}
}
}
}
/*-------------------------------------*/
std::vector<StrSeq> set_contents;
for (auto p : sets) {
for (auto g_string : *p) { /* *p == std::set */
set_contents.push_back(g_string);
}
output.push_back(set_contents);
set_contents.clear();
}
for (auto p : sets)
delete p;
}
int main() {
std::vector<std::string> input = {
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3" };
std::vector<std::vector<StrSeq>> output;
std::vector<StrSeq> input2;
for (auto s : input)
input2.push_back(StrSeq(s));
set_grouping(input2, output);
for (auto &v : output) {
sort(v.begin(), v.end(), [](auto const &lhs, auto const &rhs) {
return lhs.index < rhs.index;
});
std::cout << "{ ";
for (auto s : v) {
std::cout << "\"" << s << "\", ";
}
std::cout << "}" << std::endl;
}
return 0;
}
/* end */
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnN0YXRpYyBpbnQgTm93U2VxUyA9IDA7CgpzdHJ1Y3QgU3RyU2VxIHsKICBzdGQ6OnN0cmluZyBzdHI7CiAgaW50IGluZGV4OwogIFN0clNlcShzdGQ6OnN0cmluZyBzKSA6IHN0cihzKSwgaW5kZXgoLTEpIHt9Cn07Cgpib29sIG9wZXJhdG9yPChTdHJTZXEgYSwgU3RyU2VxIGIpIHsgcmV0dXJuIGEuc3RyIDwgYi5zdHI7IH0KCnN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJnMsIFN0clNlcSBvYikgewogIHMgPDwgb2Iuc3RyOwogIHJldHVybiBzOwp9Cgp2b2lkIHNldF9ncm91cGluZyhzdGQ6OnZlY3RvcjxTdHJTZXE+ICZpbnB1dCwgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8U3RyU2VxPj4gJm91dHB1dCkgewogIHN0ZDo6dmVjdG9yPHN0ZDo6c2V0PFN0clNlcT4gKj4gc2V0czsKICBmb3IgKGF1dG8gJnMgOiBpbnB1dCkgewogICAgc3RkOjpzdHJpbmcgZzF4LCBnMng7CiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzcyhzLnN0cik7CiAgICBnZXRsaW5lKHNzLCBnMXgsICc9Jyk7CiAgICBnZXRsaW5lKHNzLCBnMngpOwogICAgU3RyU2VxIGcxID0gU3RyU2VxKGcxeCk7CiAgICBTdHJTZXEgZzIgPSBTdHJTZXEoZzJ4KTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBzdGQ6OnNldDxTdHJTZXE+ICpnMV9pbl9zZXQgPSBudWxscHRyOwogICAgc3RkOjpzZXQ8U3RyU2VxPiAqZzJfaW5fc2V0ID0gbnVsbHB0cjsKICAgIC8qIGcxICovCiAgICBmb3IgKGF1dG8gcCA6IHNldHMpIHsKICAgICAgYXV0byBxID0gKCpwKS5maW5kKGcxKTsKICAgICAgaWYgKHEgIT0gKCpwKS5lbmQoKSkKICAgICAgICBnMV9pbl9zZXQgPSBwOwogICAgfQogICAgLyogZzIgKi8KICAgIGZvciAoYXV0byBwIDogc2V0cykgewogICAgICBhdXRvIHEgPSAoKnApLmZpbmQoZzIpOwogICAgICBpZiAocSAhPSAoKnApLmVuZCgpKSB7CiAgICAgICAgaWYgKGcxX2luX3NldCA9PSBwKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgZzJfaW5fc2V0ID0gcDsKICAgICAgfQogICAgICAKICAgIH0KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoZzFfaW5fc2V0ID09IG51bGxwdHIgJiYgZzJfaW5fc2V0ID09IG51bGxwdHIpIHsKICAgICAgZzEuaW5kZXggPSBOb3dTZXFTKys7CiAgICAgIGcyLmluZGV4ID0gTm93U2VxUysrOwogICAgICBzdGQ6OnNldDxTdHJTZXE+ICpwID0gbmV3IHN0ZDo6c2V0PFN0clNlcT4oKTsKICAgICAgKCpwKS5pbnNlcnQoZzEpOwogICAgICAoKnApLmluc2VydChnMik7CiAgICAgIHNldHMucHVzaF9iYWNrKHApOwogICAgfSBlbHNlIGlmIChnMV9pbl9zZXQgIT0gbnVsbHB0ciAmJiBnMl9pbl9zZXQgPT0gbnVsbHB0cikgewogICAgICBnMi5pbmRleCA9IE5vd1NlcVMrKzsgICAgICAKICAgICAgKCpnMV9pbl9zZXQpLmluc2VydChnMik7CiAgICB9IGVsc2UgaWYgKGcxX2luX3NldCA9PSBudWxscHRyICYmIGcyX2luX3NldCAhPSBudWxscHRyKSB7CiAgICAgIGcxLmluZGV4ID0gTm93U2VxUysrOwogICAgICAoKmcyX2luX3NldCkuaW5zZXJ0KGcxKTsKICAgIH0gZWxzZSBpZiAoZzFfaW5fc2V0ICE9IGcyX2luX3NldCkgewogICAgICBmb3IgKGF1dG8gZyA6ICpnMl9pbl9zZXQpCiAgICAgICAgKCpnMV9pbl9zZXQpLmluc2VydChnKTsKICAgICAgZm9yIChhdXRvIHAgPSBzZXRzLmJlZ2luKCk7IHAgIT0gc2V0cy5lbmQoKTsgcCsrKSB7CiAgICAgICAgaWYgKCpwID09IGcyX2luX3NldCkgewogICAgICAgICAgc2V0cy5lcmFzZShwKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHN0ZDo6dmVjdG9yPFN0clNlcT4gc2V0X2NvbnRlbnRzOwogIGZvciAoYXV0byBwIDogc2V0cykgewogICAgZm9yIChhdXRvIGdfc3RyaW5nIDogKnApIHsgLyogKnAgPT0gc3RkOjpzZXQgKi8KICAgICAgc2V0X2NvbnRlbnRzLnB1c2hfYmFjayhnX3N0cmluZyk7CiAgICB9CiAgICBvdXRwdXQucHVzaF9iYWNrKHNldF9jb250ZW50cyk7CiAgICBzZXRfY29udGVudHMuY2xlYXIoKTsKICB9ICAgICAgCgogIGZvciAoYXV0byBwIDogc2V0cykKICAgIGRlbGV0ZSBwOwp9CgppbnQgbWFpbigpIHsKICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaW5wdXQgPSB7CiAgICAiYTE9YTIiLCAiYjE9YjIiLCAiYjM9YjIiLCAiYzE9YzIiLCAiZTE9ZTIiLAogICAgImEzPWE0IiwgImMzPWM0IiwgImUxPWUzIiwgImEyPWE0IiwgImMzPWMxIiwKICAgICJiMz1hNCIsICJjMj1kMSIsICJhND1hNSIsICJkMj1jMSIsICJiND1iMyIsICJkMz1jMyIgfTsKICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTdHJTZXE+PiBvdXRwdXQ7CgogIHN0ZDo6dmVjdG9yPFN0clNlcT4gaW5wdXQyOwogIGZvciAoYXV0byBzIDogaW5wdXQpCiAgICBpbnB1dDIucHVzaF9iYWNrKFN0clNlcShzKSk7CgogIHNldF9ncm91cGluZyhpbnB1dDIsIG91dHB1dCk7CgogIGZvciAoYXV0byAmdiA6IG91dHB1dCkgewogICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCksIFtdKGF1dG8gY29uc3QgJmxocywgYXV0byBjb25zdCAmcmhzKSB7CiAgICAgIHJldHVybiBsaHMuaW5kZXggPCByaHMuaW5kZXg7CiAgICB9KTsKICAgIHN0ZDo6Y291dCA8PCAieyAiOwogICAgZm9yIChhdXRvIHMgOiB2KSB7CiAgICAgIHN0ZDo6Y291dCA8PCAiXCIiIDw8IHMgPDwgIlwiLCAiOwogICAgfQogICAgc3RkOjpjb3V0IDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CiAgfQogIHJldHVybiAwOwp9Ci8qIGVuZCAqLwo=
{ "a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4", }
{ "e1", "e2", "e3", }
{ "c1", "c2", "c3", "c4", "d1", "d2", "d3", }