#include #include #include #include #include #include #include #include #define FOR(i, v) for (int i = 0; i < v; i++) #define FORD(i, v) for (int i = v - 1; i >= 0; i--) #define REP(i, v, x) for (int i = v; i <= x; i++) #define REPD(i, v, x) for (int i = v; i >= x; i--) #define pb push_back #define fi first #define se second #define mp make_pair #define MAXB 1000 using namespace std; typedef long long i64; typedef unsigned long long u64; char buf[MAXB]; //fgets(buf, MAXB, stdin); void read(int n, char *s, ...) { int p = 0, v; va_list par; va_start(par, s); while (n--) { while (s[p] == ' ') p++; v = 0; while (isdigit(s[p])) v = v * 10 + s[p++] - '0'; *(va_arg(par, int*)) = v; } va_end(par); } char s[220][220]; int si[220][220]; char s2[220]; bool resis[256]; int resv[256]; bool no[4000], an[4000], o[4000], xo[4000], pr[4000]; int exx[4000], exy[4000]; int inp[4000]; int n, m, len, ab; int sbx, sby; const int dx[] = {1, -1, 0, 0}; const int dy[] = {0, 0, 1, -1}; vector inv[4000]; bool dfst(int x, int y) { bool f = false; if (s[x][y] == '&') an[ab] = true, f = true; if (s[x][y] == '=') { xo[ab] = true, f = true; if (s[x][y+1] == '2') inp[ab]--; } if (s[x][y] == '1') o[ab] = true, f = true; s[x][y] = '3'; if (f) return true; FOR(i, 4) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < n && ny < m) { if (s[nx][ny] == '2' || s[nx][ny] == '3') continue; if (dfst(nx, ny)) return true; } } return false; } void dfsb(int x, int y) { s[x][y] = '2'; si[x][y] = ab; sbx = min(sbx, x); sby = min(sby, y); FOR(i, 4) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < n && ny < m) { if (s[nx][ny] == '#') dfsb(nx, ny); if (s[nx][ny] == '=') { if (dy[i] == -1) inp[ab]++; else if (ny >= exy[ab]) { exx[ab] = nx, exy[ab] = ny; } } if (s[nx][ny] =='o') { no[ab] = true; if (ny >= exy[ab]) { exx[ab] = nx; exy[ab] = ny; } } } } } int getv(int b) { int res = 0; FOR(i, inp[b]) { if (an[b]) res *= inv[b][i]; if (o[b]) res = max(inv[b][i], res); if (xo[b]) res = (inv[b][i] + res) % 2; } if (no[b]) res = 1 - res; return res; } void prop(int x, int y, int v, int fx, int fy) { if (s[x][y] == '=' || s[x][y] == 'o') { s[x][y] = '3'; prop(x, y+1, v, x, y); return; } if (s[x][y] == '2') { inv[si[x][y]].pb(v); return; } if (s[x][y] == 'x') { prop(x + (x - fx), y + (y - fy), v, x, y); return; } if (s[x][y] == '+') { s[x][y] = '3'; FOR(i, 4) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < n && ny < m) { if (nx == fx && ny == fy) continue; if (s[nx][ny] == 'x' || s[nx][ny] == '+') prop(nx, ny, v, x, y); if (s[nx][ny] == '|' && dx[i]) prop(nx, ny, v, x, y); if ((s[nx][ny] == '-' || s[nx][ny] == '=') && dy[i]) prop(nx, ny, v, x, y); } } return; } if (isupper(s[x][y])) { resis[s[x][y]] = true; resv[s[x][y]] = v; return; } if (s[x][y] == '|') { s[x][y] = '3'; prop(x+x-fx, y, v, x, y); return; } if (s[x][y] == '-') { s[x][y] = '3'; prop(x, y+y-fy, v, x, y); return; } } void prints() { FOR(i, n) { s[i][m] = 0; printf("%s\n", s[i]); } FOR(i, ab) printf("%d %d %d %d\n", no[i+1], an[i+1], xo[i+1], o[i+1]); } int main() { while (1) { m = 0; n = 0; memset(si, 0, sizeof(si)); memset(inp, 0, sizeof(inp)); memset(exy, 0, sizeof(exy)); ab = 1; memset(s, ' ', sizeof(s)); memset(no, false, sizeof(no)); memset(an, false, sizeof(an)); memset(o, false, sizeof(o)); memset(xo, false, sizeof(xo)); memset(pr, false, sizeof(pr)); memset(resis, false, sizeof(resis)); while (1) { fgets(s2, 220, stdin); if (s2[0] == '*') break; len = strlen(s2); FOR(i, len) s[n][i] = s2[i]; m = max(m, len); n++; } if (n == 0) break; FOR(i, n) FOR(j, m) if (s[i][j] == '#') { sbx = n+1; sby = m+1; dfsb(i, j); dfst(sbx + 1, sby + 1); ab++; } FOR(i, ab) inv[i+1].clear(); FOR(i, n) FOR(j, m) if (s[i][j] == '0' || s[i][j] == '1') { prop(i, j + 1, s[i][j] - '0', 0, 0); } int proc = 1; while (proc != ab) { REP(i, 1, ab-1) if (inp[i] == inv[i].size() && !pr[i]) { proc++; pr[i] = true; prop(exx[i], exy[i], getv(i), 0, 0); } } FOR(i, 200) if (resis[i]) { printf("%c=%d\n", (char)i, resv[i]); } printf("\n"); } return 0; }