#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有没有办法