#include #include #include #include using namespace std; // union-find (without union by weight) typedef vector name; map P; // map to parent // roots are marked by default parent (empty vector). name find(name x) { return (0==P[x].size()) ? x : (P[x] = find(P[x])); } void onion(name x, name y) { P[find(y)] = find(x); } void getQuoted(istream& in, name& n) { // skip whitespace char c; do { c = in.get(); } while (c != '"'); // get quoted string (no escape chars). int i = 0; n[i]=c; do { n[++i] = in.get(); } while (n[i] != '"'); n[i+1]=0; } /* void putQuoted(ostream& out, name& n) { out.put(' '); for (int i = 0; n[i] != 0; ++i) out.put(n[i]); } */ main() { name tag(6), n1(33), n2(33); do { cin >> tag.begin(); if (! cin ) break; getQuoted(cin, n1); getQuoted(cin, n2); /* cerr << "echo: " << tag.begin(); putQuoted(cerr, n1); putQuoted(cerr, n2); cerr << endl; */ if (tag[4] == '!') onion(n1, n2); else { name x1 = find(n1); name x2 = find(n2); /* cerr << n1.begin() << " root " << x1.begin() << endl; cerr << n2.begin() << " root " << x2.begin() << endl; */ int i = strcmp(x1.begin(), x2.begin()); //int i = strcmp(find(n1).begin(), find(n2).begin()); cout << tag.begin() << " " << n1.begin() << " " << n2.begin() << endl << ( i == 0 ? "yes" : "no" ) << endl; } } while (cin); }