没法处理优先级求调
查看原帖
没法处理优先级求调
583610
DrAlfred楼主2022/11/20 08:31
#include <bits/stdc++.h>
using namespace std;
stack<int> sta;
char expr[1000010];
int n, brackets[1000010], b1, b2;
inline int solve(int l, int r) {
    int tmpVal;
    // const int ol = l;
    // printf("Calculating Expression from %d to %d:\n", l, r);
    if (expr[l] == '(') {
        tmpVal = solve(l + 1, brackets[l] - 1);
        l = brackets[l] + 1;
    }
    else {
        tmpVal = (expr[l] - '0');
        ++l;
    }
    while (l <= r) {
        if (expr[l] == '&') {
            if (tmpVal == 0) {
                ++b1;
                // printf("Expr %d-%d, AndBreak Beacuse expr before %d is 0\n", ol, r, l - 1);
                if (expr[l + 1] == '(') {
                    // printf("L jumped to %d\n", brackets[l] + 1);
                    l = brackets[l + 1] + 1;
                }
                else {
                    l += 2;
                }
            }
            else {
                if (expr[l + 1] == '(') {
                    tmpVal = solve(l + 2, brackets[l + 1] - 1);
                    l = brackets[l + 1] + 1;
                }
                else {
                    tmpVal = (expr[l + 1] - '0');
                    l += 2;
                }
            }
        }
        else {
            if (tmpVal == 0) {
                if (expr[l + 1] == '(') {
                    tmpVal = tmpVal || solve(l + 2, brackets[l + 1] - 1);
                    l = brackets[l + 1] + 1;
                }
                else {
                    tmpVal = tmpVal || (expr[l + 1] == '1');
                    l += 2;
                }
            }
            else {
                // printf("Expr %d-%d, OrBreak Beacuse expr before %d is %d\n", ol, r, l - 1, tmpVal);
                ++b2;
                if (expr[l + 1] == '(') {
                    // tmpVal = solve(l + 2, brackets[l + 1] - 1);
                    l = brackets[l + 1] + 1;
                }
                else {
                    // tmpVal = solve(l + 2, r);
                    l += 2;
                }
            }
        }
    }
    // printf("res is %d\n", tmpVal);
    return tmpVal;
}
int main(int argc, char const *argv[]) {
    scanf("%s", expr + 1);
    n = strlen(expr + 1);
    for (int i = 1; i <= n; i++) {
        if (expr[i] == '(') {
            sta.push(i);
        }
        if (expr[i] == ')') {
            brackets[i] = sta.top();
            brackets[sta.top()] = i;
            // printf("Matched Brackets: (%d, %d)\n", sta.top(), i);
            sta.pop();
        }
    }
    printf("%d\n", solve(1, n));
    printf("%d %d\n", b1, b2);
    system("pause");
    return 0;
}

样例就会被hack, 因为他是直接计算的

不想用树, 想问问各位dalao有没有办法

2022/11/20 08:31
加载中...