玄笙依旧怜 • 1个月前
#include <iostream>
#include <string>
using namespace std;
struct Result {
int val;
int cnt_and;
int cnt_or;
Result(int v = 0, int a = 0, int o = 0) : val(v), cnt_and(a), cnt_or(o) {}
};
class Node {
public:
virtual Result eval() = 0;
virtual ~Node() {}
};
class ValueNode : public Node {
int val;
public:
ValueNode(int v) : val(v) {}
Result eval() override {
return Result(val, 0, 0);
}
};
class AndNode : public Node {
Node* left;
Node* right;
public:
AndNode(Node* l, Node* r) : left(l), right(r) {}
~AndNode() {
delete left;
delete right;
}
Result eval() override {
Result lres = left->eval();
if (lres.val == 0) {
return Result(0, lres.cnt_and + 1, lres.cnt_or);
} else {
Result rres = right->eval();
return Result(lres.val & rres.val, lres.cnt_and + rres.cnt_and, lres.cnt_or + rres.cnt_or);
}
}
};
class OrNode : public Node {
Node* left;
Node* right;
public:
OrNode(Node* l, Node* r) : left(l), right(r) {}
~OrNode() {
delete left;
delete right;
}
Result eval() override {
Result lres = left->eval();
if (lres.val == 1) {
return Result(1, lres.cnt_and, lres.cnt_or + 1);
} else {
Result rres = right->eval();
return Result(lres.val | rres.val, lres.cnt_and + rres.cnt_and, lres.cnt_or + rres.cnt_or);
}
}
};
Node* parseOr(const string& s, int& pos);
Node* parseAnd(const string& s, int& pos);
Node* parseFactor(const string& s, int& pos);
Node* parseOr(const string& s, int& pos) {
Node* node = parseAnd(s, pos);
while (pos < s.size() && s[pos] == '|') {
pos++;
Node* rhs = parseAnd(s, pos);
node = new OrNode(node, rhs);
}
return node;
}
Node* parseAnd(const string& s, int& pos) {
Node* node = parseFactor(s, pos);
while (pos < s.size() && s[pos] == '&') {
pos++;
Node* rhs = parseFactor(s, pos);
node = new AndNode(node, rhs);
}
return node;
}
Node* parseFactor(const string& s, int& pos) {
if (s[pos] == '(') {
pos++;
Node* node = parseOr(s, pos);
if (pos >= s.size() || s[pos] != ')') {
// Input is valid per problem statement, error handling omitted
}
pos++;
return node;
} else {
char c = s[pos++];
return new ValueNode(c == '1' ? 1 : 0);
}
}
int main() {
string s;
cin >> s;
int pos = 0;
Node* root = parseOr(s, pos);
Result res = root->eval();
cout << res.val << "\n";
cout << res.cnt_and << " " << res.cnt_or << endl;
delete root;
return 0;
}
评论:
请先登录,才能进行评论