#include <cstdio> #include <algorithm> #include <vector> #include <set> #include <unordered_map> #include <queue> #define pb push_back #define sz size() using namespace std; typedef vector<int> vi; int n; char lastc, nowc; char getbufchar() { lastc = nowc; nowc = getchar(); return nowc; } bool getuntil(char c, char stopchar) { char a; do { a = getbufchar(); } while(a != c && a != stopchar); return a == c; } struct var { bool neg; int x; void print() const {printf("%cx%d ", neg? '~':' ', x);} bool ist(const vector<int>& X) const { return (bool)(X[x-1]) != neg; } }; bool ist(const vector<var>& vv, const vector<int>& X) { for(const var& v: vv) if(v.ist(X)) return true; return false; } bool ist(const vector<vector<var>>& vvv, const vector<int>& X) { for(const vector<var>& vv: vvv) if(!ist(vv, X)) return false; return true; } bool inc(vector<int>& X) { for(int i=0; i<X.sz; ++i) { ++X[i]; if(X[i] <= 1) return true; X[i] = 0; if(i == X.sz-1) return false; } } vector<var> getparen() { vector<var> res; if(!getuntil('(', EOF)) return res; while(getuntil('x', ')')) { bool neg = lastc == '~'; int x; scanf("%d", &x); res.pb({neg, x}); } return res; } vector<vector<var>> getinput() { vector<vector<var>> input; while(true) { vector<var> p = getparen(); if(!p.sz) return input; else input.pb(p); } } int main() { scanf("%d", &n); vector<vector<var>> input = getinput(); vector<int> X(n, 0); int cnt = 0; do { if(ist(input, X)) ++cnt; } while(inc(X)); printf("%d\n", cnt); }
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 78 79 80 81 82 83 84 85 86 87 88 | #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <unordered_map> #include <queue> #define pb push_back #define sz size() using namespace std; typedef vector<int> vi; int n; char lastc, nowc; char getbufchar() { lastc = nowc; nowc = getchar(); return nowc; } bool getuntil(char c, char stopchar) { char a; do { a = getbufchar(); } while(a != c && a != stopchar); return a == c; } struct var { bool neg; int x; void print() const {printf("%cx%d ", neg? '~':' ', x);} bool ist(const vector<int>& X) const { return (bool)(X[x-1]) != neg; } }; bool ist(const vector<var>& vv, const vector<int>& X) { for(const var& v: vv) if(v.ist(X)) return true; return false; } bool ist(const vector<vector<var>>& vvv, const vector<int>& X) { for(const vector<var>& vv: vvv) if(!ist(vv, X)) return false; return true; } bool inc(vector<int>& X) { for(int i=0; i<X.sz; ++i) { ++X[i]; if(X[i] <= 1) return true; X[i] = 0; if(i == X.sz-1) return false; } } vector<var> getparen() { vector<var> res; if(!getuntil('(', EOF)) return res; while(getuntil('x', ')')) { bool neg = lastc == '~'; int x; scanf("%d", &x); res.pb({neg, x}); } return res; } vector<vector<var>> getinput() { vector<vector<var>> input; while(true) { vector<var> p = getparen(); if(!p.sz) return input; else input.pb(p); } } int main() { scanf("%d", &n); vector<vector<var>> input = getinput(); vector<int> X(n, 0); int cnt = 0; do { if(ist(input, X)) ++cnt; } while(inc(X)); printf("%d\n", cnt); } |