#include #include #include FILE *input; char a [1000]; char result [1000]; int read_case () { fgets (a, 256, input); if (feof (input)) return 0; return 1; } int pos = 0; void getTerm (); void getFaktor () { int b [256]; int k = 0; for (int i = 'A'; i <= 'Z'; i++) b [i] = 0; switch (a [pos]) { case '{': pos++; while (a [pos] != '}') { b [a [pos++]] = 1; } for (i = 'A'; i <= 'Z'; i++) if (b [i]) result [k++] = i; result [k] = 0; pos++; break; case '(': pos++; getTerm (); pos++; } } void getSummand () { char op1 [256], op2 [256]; int accept = 1; getFaktor (); while (accept) { accept = 0; switch (a [pos]){ case '*': pos++; strcpy (op1, result); getFaktor (); strcpy (op2, result); int i = 0, j = 0, k = 0; while (op1 [i] != 0 && op2 [j] != 0) { if (op1 [i] == op2 [j]) { result [k++] = op1 [i]; i++, j++; } else if (op1 [i] < op2 [j]) { i++; } else { j++; } } result [k] = 0; // printf ("%s * %s = %s\n", op1, op2, result); accept = 1; break; } } } void getTerm () { char op1 [256], op2 [256]; int accept = 1; getSummand (); while (accept) { int i = 0, j = 0, k = 0; accept = 0; switch (a [pos]) { case '+': strcpy (op1, result); pos++; getSummand (); strcpy (op2, result); while (op1 [i] != 0 || op2 [j] != 0) { if (op1 [i] == op2 [j]) { result [k++] = op1 [i]; i++, j++; } else if (op1 [i] == 0) { result [k++] = op2 [j++]; } else if (op2 [j] == 0) { result [k++] = op1 [i++]; } else if (op1 [i] < op2 [j]) { result [k++] = op1 [i++]; } else { result [k++] = op2 [j++]; } } result [k] = 0; // printf ("%s + %s = %s\n", op1, op2, result); accept = 1; break; case '-': strcpy (op1, result); pos++; getSummand (); strcpy (op2, result); while (op1 [i] != 0) { if (op1 [i] == op2 [j]) { i++, j++; } else if (op2 [j] == 0) { result [k++] = op1 [i++]; } else if (op1 [i] < op2 [j]) { result [k++] = op1 [i++]; } else { j++; } } result [k] = 0; accept = 1; break; } } } void solve_case () { pos = 0; getTerm (); printf ("{%s}\n", result); } int main () { input = fopen ("friends.in", "r"); assert (input != NULL); while (read_case ()) solve_case (); fclose (input); return 0; }