#include #include #include #include using namespace std; struct P { char s[5]; int n; }node[11000], get[11000]; int cmp(const void *a , const void *b) { return strcmp( (*(P *)a).s, (*(P *)b).s ); } char str[11000], str1[11000]; int n, num; void element(char *str, int s, int t, int k, P *p); void insert(char *s, int k, P *p) { int i; for ( i = 0 ; i < num ; i++ ) { if ( !strcmp(s, p[i].s) ) break; } if ( i < num ) p[i].n+=k; else p[num].n+=k, strcpy(p[num++].s, s); } void sequence(char *str, int s, int t, int k, P *p) { int i = s; while ( i < t ) { if ( '(' ==str[i] ) { int ti, tk; for ( ti = i+1, tk= 1 ; tk ; ti++ ) { if ( '(' == str[ti] ) tk++; else if ( ')' == str[ti] ) tk--; } if ( '0' <= str[ti] && str[ti] <= '9' ) { int ttk, te= ti; for ( ttk = 0; '0' <= str[ti] && str[ti] <= '9' ; ti++ ) ttk= ttk*10+str[ti]-'0'; element(str, i, te, k*ttk, p); } else element(str, i, ti, k, p); i= ti; } else if ( 'A' <= str[i] && str[i] <= 'Z' ) { int tk= i; i++; if ( 'a' <= str[i] && str[i] <= 'z' ) i++; if ( '0' <= str[i] && str[i] <= '9' ) { int ttk; for ( ttk = 0; '0' <= str[i] && str[i] <= '9' ; i++ ) ttk= ttk*10+str[i]-'0'; element(str, tk, i, k*ttk, p); } else element(str, tk, i, k, p); } } } void element(char *str, int s, int t, int k, P *p) { if ( '(' == str[s] && ')' == str[t-1] ) sequence(str, s+1, t-1, k, p); else { char tmp[5]; tmp[0] = str[s]; if ( 'a' <= str[s+1] && str[s+1] <= 'z' ) tmp[1]= str[s+1], tmp[2]= 0; else tmp[1]= 0; insert(tmp, k, p); } } void slove(char *str, P *p) { int len = strlen(str), i= 0, j, k; num= 0; while ( i < len ) { char ch; ch= str[i]; if ( '0' <= ch && ch <= '9' ) { for ( k = 0; '0' <= str[i] && str[i] <= '9' ; i++ ) k= k*10+str[i]-'0'; for ( j = i ; str[j] && '+' != str[j] ; j++ ); sequence(str, i, j, k, p); i= j+1; } else { for ( j = i+1 ; str[j] && '+' != str[j] ; j++ ); sequence(str, i, j, 1, p); i= j+1; } } } int main() { while ( EOF!= scanf("%s", str) ) { memset(node, 0, sizeof(node)); slove(str, node); int m= num; qsort(node, m, sizeof(P), cmp); scanf("%d", &n); while ( n-- ) { scanf("%s", str1); memset(get, 0, sizeof(get)); slove(str1, get); if ( m == num ) { qsort(get, m, sizeof(P), cmp); int i; for ( i = 0 ; i <= num && node[i].n == get[i].n && !strcmp(node[i].s, get[i].s) ; i++ ); if ( i > num ) { printf("%s==%s\n", str, str1); continue; } } printf("%s!=%s\n", str, str1); } } return 0; }