#include #include typedef unsigned long ul; static struct Write { ul addr; ul val; } writes[1024]; static int len; static void write(ul addr, ul val) { for (int i = 0; i < len; ++i) { if (writes[i].addr == addr) { writes[i].val = val; return; } } writes[len].addr = addr; writes[len++].val = val; } static struct Write writes2[0xFFFFFFFFF]; static ul len2; static void write2(ul addr, ul val) { for (int i = 0; i < len2; ++i) { if (writes2[i].addr == addr) { writes2[i].val = val; return; } } writes2[len2].addr = addr; writes2[len2++].val = val; } int main(void) { ul mask = 0; ul bits = 0; for (;;) { char str[37]; int n = scanf("mask = %s\n", str); if (n < 0) break; if (n) { mask = 0; bits = 0; for (ul i = 35; i < 36; --i) { if (str[35-i] == 'X') { mask |= 1UL << i; } else if (str[35-i] == '1') { bits |= 1UL << i; } } } else { ul addr, val; n = scanf("em[%lu] = %lu\n", &addr, &val); if (n < 2) break; write(addr, (val & mask) | bits); addr |= bits; addr &= ~mask; ul writes = 1UL << __builtin_popcountl(mask); for (ul i = 0; i < writes; ++i) { ul a = addr; ul w = i; for (int j = 0; j < 36; ++j) { if (mask & (1UL << j)) { a |= (w & 1) << j; w >>= 1; } } write2(a, val); } } } ul sum = 0; for (int i = 0; i < len; ++i) { sum += writes[i].val; } printf("%lu\n", sum); sum = 0; for (ul i = 0; i < len2; ++i) { sum += writes2[i].val; } printf("%lu\n", sum); }