#include #include #include static struct Board { int mark; int nums[25]; } boards[128]; static int len; static int win(const struct Board *board) { int row = 0x1F; int col = 0x108421; for (int i = 0; i < 5; ++i) { if ((board->mark & row) == row) return 1; if ((board->mark & col) == col) return 1; row <<= 5; col <<= 1; } return 0; } static int winner(void) { for (int i = 0; i < len; ++i) { if (win(&boards[i])) return i; } return -1; } int main(void) { char *buf = NULL; size_t cap = 0; getline(&buf, &cap, stdin); int n = 0; int nums[128]; while (buf) { nums[n++] = strtol(strsep(&buf, ","), NULL, 10); } for (int i = 0;; ++i) { if (EOF == scanf(" %d", &boards[len].nums[i%25])) break; if (i%25 == 24) len++; } int i, w; for (i = 0; (w = winner()) < 0 && i < n; ++i) { for (int j = 0; j < len; ++j) { for (int k = 0; k < 25; ++k) { if (boards[j].nums[k] == nums[i]) boards[j].mark |= 1 << k; } } } int num = nums[i-1]; int sum = 0; for (int i = 0; i < 25; ++i) { if (!(boards[w].mark & (1 << i))) sum += boards[w].nums[i]; } printf("%d\n", sum * num); for (; i < n; ++i) { for (int j = 0; j < len; ++j) { for (int k = 0; k < 25; ++k) { if (boards[j].nums[k] == nums[i]) { int won = win(&boards[j]); boards[j].mark |= 1 << k; if (!won && win(&boards[j])) { w = j; num = nums[i]; sum = 0; for (int i = 0; i < 25; ++i) { if (!(boards[w].mark & (1 << i))) { sum += boards[w].nums[i]; } } } } } } } printf("%d\n", sum * num); }