#include #include #include int MMolecule(char s[], int *p); int dic[30][30]; int Number(char s[], int *p) { int r, r2; r = s[*p] - '0'; (*p)++; if (isdigit(s[*p])) { r *= 10; r += (s[*p] - '0'); (*p)++; } return r; } int Atom(char s[], int *p) { int c1, c2; c1 = s[*p] - 'A'; (*p)++; if (islower(s[*p])) { c2 = s[*p] - 'a' + 1; (*p)++; } else { c2 = 0; } return dic[c1][c2]; } int Molecule(char s[], int *p) { int r, r2; if (isupper(s[*p])) { if (0 > (r = Atom(s, p))) { return -1; } if(isdigit(s[*p])) { if (0 > (r2 = Number(s, p))) { return -1; } r *= r2; } } else if (s[*p] == '(') { (*p)++; if (0 > (r = MMolecule(s, p))) { return -1; } if (s[*p] != ')') { return -1; } (*p)++; if (0 > (r2 = Number(s, p))) { return -1; } r *= r2; } else { return -1; } return r; } int MMolecule(char s[], int *p) { int r, r2; if (0 > (r = Molecule(s, p))) { return -1; } if (s[*p] == '(' || isupper(s[*p])) { if (0 > (r2 = MMolecule(s, p))) { return -1; } r += r2; } return r; } int main() { char s[1024], a[1024]; int w, p, i, j; freopen("mf.txt", "r", stdin); for (i = 0; i < 30; i++) for (j = 0; j < 30; j++) dic[i][j] = -1; while (1) { gets(s); if (0 == strcmp(s, "END_OF_FIRST_PART")) { break; } sscanf(s, "%s %d", a, &w); if (strlen(a) == 1) { dic[ a[0]-'A' ][ 0 ] = w; } else { dic[ a[0]-'A' ] [ a[1]-'a'+1 ] = w; } } while (1) { gets(s); p = 0; if (0 == strcmp(s, "0")) { break; } w = MMolecule(s, &p); if (w < 0) { printf("UNKNOWN\n"); } else { printf("%d\n", w); } } return 0; }