#include <bits/stdc++.h> using namespace std; const int maxn = 1000111; bool claus[maxn]; int n, m, res, x[maxn]; char formula[maxn]; bool parse() { int a_claus = -1; bool r_claus = false; bool ok = true; for (int i = 0; i < m; i++) { if (formula[i] == '(') { r_claus = false; a_claus++; } else if (formula[i] == ')') { if (r_claus == true) claus[a_claus] = true; else claus[a_claus] = false; } else if (formula[i] == 'x') { int sz = (ok == true) ? 1 : 0; int index = 0; ++i; while (formula[i] >= '0' && formula[i] <= '9') { index *= 10; index += formula[i] - '0'; ++i; } --i; if (x[index - 1] == sz) { r_claus = true; } ok = true; } else if (formula[i] == '~') { ok = false; } } for (int i = 0; i <= a_claus; i++) if (claus[i] == false) return false; return true; } int main () { scanf("%d", &n); char c = getchar(); while ((c = getchar()) != EOF) { formula[m] = c; ++m; } for (int i = 0; i < (1 << n); i++) { int y = i; for (int bit = 0; bit < n; bit++, y /= 2) x[bit] = (y & 1); bool query = parse(); if (query == true) ++res; } printf("%d\n", res); 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 | #include <bits/stdc++.h> using namespace std; const int maxn = 1000111; bool claus[maxn]; int n, m, res, x[maxn]; char formula[maxn]; bool parse() { int a_claus = -1; bool r_claus = false; bool ok = true; for (int i = 0; i < m; i++) { if (formula[i] == '(') { r_claus = false; a_claus++; } else if (formula[i] == ')') { if (r_claus == true) claus[a_claus] = true; else claus[a_claus] = false; } else if (formula[i] == 'x') { int sz = (ok == true) ? 1 : 0; int index = 0; ++i; while (formula[i] >= '0' && formula[i] <= '9') { index *= 10; index += formula[i] - '0'; ++i; } --i; if (x[index - 1] == sz) { r_claus = true; } ok = true; } else if (formula[i] == '~') { ok = false; } } for (int i = 0; i <= a_claus; i++) if (claus[i] == false) return false; return true; } int main () { scanf("%d", &n); char c = getchar(); while ((c = getchar()) != EOF) { formula[m] = c; ++m; } for (int i = 0; i < (1 << n); i++) { int y = i; for (int bit = 0; bit < n; bit++, y /= 2) x[bit] = (y & 1); bool query = parse(); if (query == true) ++res; } printf("%d\n", res); return 0; } |