#include #include #include #include #include #include using namespace std; struct Term { int n; string exp; Term() : n(1) {} Term operator *(const Term& b) { Term r = *this; r.n *= b.n; r.exp += b.exp; return r; } }; struct Lex { const char* str; int index; Lex(const string& s) : str(s.c_str()), index(0) {} bool isNum() { ignoreSpace(); return isdigit(str[index]); } int getNum() { ignoreSpace(); int r = 0; while(isdigit(str[index])) { r = r * 10 + (str[index++]-'0'); } return r; } char peak() { ignoreSpace(); return str[index]; } char getC() { ignoreSpace(); return str[index++]; } void ignoreSpace() { while(str[index] == ' ') ++index; } }; vector exp(Lex& lex); vector fact(Lex& lex) { vector r; if(lex.isNum()) { Term t; t.n = lex.getNum(); if(t.n) r.push_back(t); } else if(lex.peak() == '(') { lex.getC(); r = exp(lex); lex.getC(); } else { char c = lex.getC(); int k = 1; if(lex.peak() == '^') { lex.getC(); k = lex.getNum(); } Term t; t.exp = string(k, c); r.push_back(t); } return r; } vector term(Lex& lex) { vector r; r = fact(lex); while(lex.peak() != '+' && lex.peak() != '-' && lex.peak() != ')' && lex.peak() != 0) { vector a = r; vector b = fact(lex); r.clear(); for(int i = 0; i < (int)a.size(); ++i) for(int j = 0; j < (int)b.size(); ++j) r.push_back(a[i] * b[j]); } return r; } vector exp(Lex& lex) { vector r; r = term(lex); while(lex.peak() == '+' || lex.peak() == '-') { bool minus = lex.getC() == '-'; vector t = term(lex); for(int i = 0; i < (int)t.size(); ++i) { if(minus) t[i].n *= -1; r.push_back(t[i]); } } return r; } map marge(const vector& v) { map r; for(int i = 0; i < (int)v.size(); ++i) { string key = v[i].exp; sort(key.begin(), key.end()); if((r[key] += v[i].n) == 0) r.erase(key); } return r; } int main() { string line; while(getline(cin, line) && line[0] != '.') { Lex lex(line); map base = marge(exp(lex)); while(getline(cin, line) && line[0] != '.') { Lex lex(line); map a = marge(exp(lex)); if(base == a) { cout << "yes" << endl; } else { cout << "no" << endl; } } cout << "." << endl; } }