#include <iostream>
#include <set>
#include <vector>
using namespace std;
set<int> lT[1000001];
set<int> lF[1000001];
string text;
set<int> b;
void extractOne(int n, int from, int to) {
bool negate = false;
if (text[from] == '~') {
negate = true;
from++;
}
from++;
int k = to;
while (text[k] == ' ') k--;
int p = 1;
int number = 0;
while (k >= from) {
number += p * (text[k] - '0');
p *= 10;
k--;
}
if (negate) {
lF[number].insert(n);
} else {
lT[number].insert(n);
}
b.insert(number);
}
void extractV(int nrK, int from, int to) {
int i = from;
while (i <= to) {
int start = i;
while (i <= to && text[i] != 'v') {
i++;
}
extractOne(nrK, start, i - 1);
i = i + 2;
}
}
int main() {
int n;
cin >> n;
cin.get();
getline(cin, text);
int nrK = 1;
int pos = 0;
while (pos < text.size()) {
int start = pos;
while (text[pos] != ')') {
pos++;
}
if (nrK == 1) {
extractV(nrK, start + 1, pos - 1);
} else {
extractV(nrK, start + 4, pos - 1);
}
pos++;
nrK++;
}
/*
for (set<int>::iterator it = b.begin(); it != b.end(); it++) {
cout << "Variable number: " << *it << ". " << endl;
cout << "Without negation in: ";
for (set<int>::iterator itt = lT[*it].begin(); itt != lT[*it].end(); itt++) {
cout << *itt << " ";
}
cout << endl << "With negation in: ";
for (set<int>::iterator itt = lF[*it].begin(); itt != lF[*it].end(); itt++) {
cout << *itt << " ";
}
cout << endl << endl;
}
*/
int count = 0;
for (long long i = 0; i < (1 << b.size()); i++) {
set <int> OK;
int p = 1;
int z = 1;
while(p < (1 << b.size())) {
if((p & i) != 0) {
OK.insert(lT[z].begin(), lT[z].end());
} else {
OK.insert(lF[z].begin(), lF[z].end());
}
p *= 2;
z++;
}
if(OK.size() == nrK - 1) {
count++;
}
}
cout << count << endl;
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <iostream> #include <set> #include <vector> using namespace std; set<int> lT[1000001]; set<int> lF[1000001]; string text; set<int> b; void extractOne(int n, int from, int to) { bool negate = false; if (text[from] == '~') { negate = true; from++; } from++; int k = to; while (text[k] == ' ') k--; int p = 1; int number = 0; while (k >= from) { number += p * (text[k] - '0'); p *= 10; k--; } if (negate) { lF[number].insert(n); } else { lT[number].insert(n); } b.insert(number); } void extractV(int nrK, int from, int to) { int i = from; while (i <= to) { int start = i; while (i <= to && text[i] != 'v') { i++; } extractOne(nrK, start, i - 1); i = i + 2; } } int main() { int n; cin >> n; cin.get(); getline(cin, text); int nrK = 1; int pos = 0; while (pos < text.size()) { int start = pos; while (text[pos] != ')') { pos++; } if (nrK == 1) { extractV(nrK, start + 1, pos - 1); } else { extractV(nrK, start + 4, pos - 1); } pos++; nrK++; } /* for (set<int>::iterator it = b.begin(); it != b.end(); it++) { cout << "Variable number: " << *it << ". " << endl; cout << "Without negation in: "; for (set<int>::iterator itt = lT[*it].begin(); itt != lT[*it].end(); itt++) { cout << *itt << " "; } cout << endl << "With negation in: "; for (set<int>::iterator itt = lF[*it].begin(); itt != lF[*it].end(); itt++) { cout << *itt << " "; } cout << endl << endl; } */ int count = 0; for (long long i = 0; i < (1 << b.size()); i++) { set <int> OK; int p = 1; int z = 1; while(p < (1 << b.size())) { if((p & i) != 0) { OK.insert(lT[z].begin(), lT[z].end()); } else { OK.insert(lF[z].begin(), lF[z].end()); } p *= 2; z++; } if(OK.size() == nrK - 1) { count++; } } cout << count << endl; return 0; } |
English