#include <cstdio>
#include <vector>
typedef int I;
typedef std::vector<I> VI;
static I bruteforce(const I* v, I n, I kl) {
if (n > 31)
return -1; // nie umiem
I last = 1 << n;
I ret = 0;
for (I bits=0; bits<last; ++ bits) {
bool varok = true;
for (I k=0; k<kl; ++k) {
const I* p = &v[k*(n+1)+1];
I nli = p[-1];
bool ok = false;
for (I li=0; li<nli; ++li) {
I val = p[li];
if (val > 0) {
if (bits & (1 << (val - 1))) {
ok = true;
break;
}
} else {
if (!(bits & (1 << (-val -1)))) {
ok = true;
break;
}
}
}
if (!ok) {
varok = false;
break;
}
}
if (varok) {
++ret;
}
}
return ret;
}
int main() {
I n, row = -1, col=0, x;
bool neg = false;
scanf("%d\n", &n);
VI v;
for (;;) {
char c;
if (scanf("%c", &c) <= 0)
break;
switch(c) {
case '(':
col = 0;
++row;
v.resize((n+1)*(row+1));
break;
case ')':
v[row*(n+1)] = col;
break;
case '~':
neg = true;
break;
case 'x':
scanf("%d", &x);
if (neg) {
x = -x;
neg = false;
}
++col;
v[row*(n+1) + col] = x;
break;
}
}
printf("%d\n", bruteforce(&v[0], n, row+1));
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <cstdio> #include <vector> typedef int I; typedef std::vector<I> VI; static I bruteforce(const I* v, I n, I kl) { if (n > 31) return -1; // nie umiem I last = 1 << n; I ret = 0; for (I bits=0; bits<last; ++ bits) { bool varok = true; for (I k=0; k<kl; ++k) { const I* p = &v[k*(n+1)+1]; I nli = p[-1]; bool ok = false; for (I li=0; li<nli; ++li) { I val = p[li]; if (val > 0) { if (bits & (1 << (val - 1))) { ok = true; break; } } else { if (!(bits & (1 << (-val -1)))) { ok = true; break; } } } if (!ok) { varok = false; break; } } if (varok) { ++ret; } } return ret; } int main() { I n, row = -1, col=0, x; bool neg = false; scanf("%d\n", &n); VI v; for (;;) { char c; if (scanf("%c", &c) <= 0) break; switch(c) { case '(': col = 0; ++row; v.resize((n+1)*(row+1)); break; case ')': v[row*(n+1)] = col; break; case '~': neg = true; break; case 'x': scanf("%d", &x); if (neg) { x = -x; neg = false; } ++col; v[row*(n+1) + col] = x; break; } } printf("%d\n", bruteforce(&v[0], n, row+1)); return 0; } |
English