#include #include #include int chrcmp(void const * a, void const * b) { return (*(char const *) a) - *((char const *) b); } int priority(int c) { if (c >= 'A' && c <= 'Z') return 27 + c - 'A'; if (c >= 'a' && c <= 'z') return 1 + c - 'a'; fprintf(stderr, "Unexpected priority request: %c\n", c); return -1; } int min(int a, int b) { return a < b ? a : b; } int min3(int a, int b, int c) { return min(min(a, b), c); } int main() { char buf[3][BUFSIZ]; int score = 0; while (fgets(buf[0], sizeof(buf[0]), stdin) && fgets(buf[1], sizeof(buf[1]), stdin) && fgets(buf[2], sizeof(buf[2]), stdin)) { int n, i, j, k; for (n = 0; n < 3; ++n) { int len = strlen(buf[n]); if (len && buf[n][len - 1] == '\n') { --len; buf[n][len] = '\0'; } if (len % 2 == 1) fprintf(stderr, "Unexpected length: %d\n", len); qsort(buf[n], len, 1, chrcmp); } i = 0; j = 0; k = 0; while (buf[0][i] != '\0' && buf[1][j] != '\0' && buf[2][k] != '\0') { int n = min3(buf[0][i], buf[1][j], buf[2][k]); if (buf[0][i] == n && buf[1][j] == n && buf[2][k] == n) break; if (buf[0][i] == n) ++i; if (buf[1][j] == n) ++j; if (buf[2][k] == n) ++k; } if (buf[0][i] == '\0' || buf[1][j] == '\0' || buf[2][k] == '\0') { fprintf(stderr, "No match found in %s/%s/%s\n", buf[0], buf[1], buf[2]); return -1; } score += priority(buf[0][i]); } printf("Score: %d\n", score); return 0; }