超级难的方法

玄笙依旧怜  •  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;
}

评论:

请先登录,才能进行评论