#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
char buffer[1000000 + 2];
int main() {
int n;
scanf("%d", &n);
getchar();
fgets(buffer, sizeof(buffer), stdin);
char *ptr = strchr(buffer, '\n');
if (ptr != NULL) {
*ptr = '\0';
}
char c;
int input_length = strlen(buffer);
vector<vector<pair<int, int> > > clauses;
for (int i = 0; i < input_length;) {
// Should be '('.
i++;
// Read clause.
vector<pair<int, int> > clause;
while (1) {
int idx, value = 1;
c = buffer[i++];
if (c == '~') {
value = 0;
i++;
}
idx = atoi(&buffer[i]);
while (isdigit(buffer[i])) {
i++;
}
clause.push_back(make_pair(idx, value));
if (buffer[i] == ' ') {
i += 3;
} else {
i += 4;
break;
}
}
/*printf("Clause:\n");
for (auto it : clause) {
printf(" (%d, %d)\n", it.first, it.second);
}*/
clauses.push_back(clause);
}
int result = 0;
for (int i = 0; i < (1 << n); i++) {
bool success = true;
for (auto clause : clauses) {
bool found = false;
for (auto literal : clause) {
if ((i & (1 << (literal.first - 1))) == (literal.second << (literal.first - 1))) {
found = true;
break;
}
}
if (!found) {
success = false;
break;
}
}
if (success) {
result++;
}
}
printf("%d\n", result);
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 | #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <algorithm> #include <cctype> using namespace std; char buffer[1000000 + 2]; int main() { int n; scanf("%d", &n); getchar(); fgets(buffer, sizeof(buffer), stdin); char *ptr = strchr(buffer, '\n'); if (ptr != NULL) { *ptr = '\0'; } char c; int input_length = strlen(buffer); vector<vector<pair<int, int> > > clauses; for (int i = 0; i < input_length;) { // Should be '('. i++; // Read clause. vector<pair<int, int> > clause; while (1) { int idx, value = 1; c = buffer[i++]; if (c == '~') { value = 0; i++; } idx = atoi(&buffer[i]); while (isdigit(buffer[i])) { i++; } clause.push_back(make_pair(idx, value)); if (buffer[i] == ' ') { i += 3; } else { i += 4; break; } } /*printf("Clause:\n"); for (auto it : clause) { printf(" (%d, %d)\n", it.first, it.second); }*/ clauses.push_back(clause); } int result = 0; for (int i = 0; i < (1 << n); i++) { bool success = true; for (auto clause : clauses) { bool found = false; for (auto literal : clause) { if ((i & (1 << (literal.first - 1))) == (literal.second << (literal.first - 1))) { found = true; break; } } if (!found) { success = false; break; } } if (success) { result++; } } printf("%d\n", result); return 0; } |
English