#include <cstdio> #include <vector> #include <cstring> #include <algorithm> const int N = 1e6 + 5; int n, m, ans; std::vector<int> a[N]; std::vector<int> b[N]; bool bo[N]; char c; inline void check() { for (int i = 1; i <= m; ++i) { bool r = false; for (int j = 0; j < a[i].size(); ++j) { r |= bo[a[i][j]] ^ b[i][j]; if (r) break; } if (!r) return ; } ++ans; } inline void dfs(int x) { if (x > n) { check(); return ; } bo[x] = true; dfs(x + 1); bo[x] = false; dfs(x + 1); } int main() { scanf("%d", &n); while (c = getchar(), c > 0) { if (c != '(') continue; ++m; int d = 0, num; do { c = getchar(); if (c == 'v') d = 0; if (c == '~') d = 1; if (c >= '0' && c <= '9') { num = c - '0'; while (c = getchar(), c >= '0' && c <= '9') num = num * 10 + c - '0'; a[m].push_back(num); b[m].push_back(d); } if (c == ')') break; } while (true); } dfs(1); printf("%d\n", ans); 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 | #include <cstdio> #include <vector> #include <cstring> #include <algorithm> const int N = 1e6 + 5; int n, m, ans; std::vector<int> a[N]; std::vector<int> b[N]; bool bo[N]; char c; inline void check() { for (int i = 1; i <= m; ++i) { bool r = false; for (int j = 0; j < a[i].size(); ++j) { r |= bo[a[i][j]] ^ b[i][j]; if (r) break; } if (!r) return ; } ++ans; } inline void dfs(int x) { if (x > n) { check(); return ; } bo[x] = true; dfs(x + 1); bo[x] = false; dfs(x + 1); } int main() { scanf("%d", &n); while (c = getchar(), c > 0) { if (c != '(') continue; ++m; int d = 0, num; do { c = getchar(); if (c == 'v') d = 0; if (c == '~') d = 1; if (c >= '0' && c <= '9') { num = c - '0'; while (c = getchar(), c >= '0' && c <= '9') num = num * 10 + c - '0'; a[m].push_back(num); b[m].push_back(d); } if (c == ')') break; } while (true); } dfs(1); printf("%d\n", ans); return 0; } |