#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e6 + 7;
char s[MAXN];
int sum_or, sum_and, tag_or[MAXN], tag_and[MAXN], last_or[MAXN], last_and[MAXN];
int len;
bool dfs(int l, int r) {
if (l == r)
return s[l] - '0';
if (tag_or[r] > l) {
int tmp1 = dfs(l, tag_or[r] - 1);
if (tmp1) {
sum_or++;
return 1;
}
return dfs(tag_or[r] + 1, r);
}
if (tag_and[r] > l) {
int tmp1 = dfs(l, tag_and[r] - 1);
if (!tmp1) {
sum_and++;
return 0;
}
return dfs(tag_and[r] + 1, r);
}
if (s[l] == '(' && s[r] == ')')
return dfs(l + 1, r - 1);
}
signed main() {
freopen("expr4.in", "r", stdin);
scanf("%s", s);
int deep = 1;
len = strlen(s);
for (int i = 0; i < len; i++) {
if (s[i] == '(') deep++;
if (s[i] == ')') deep--;
if (s[i] == '|') last_or[deep] = i;
if (s[i] == '&') last_and[deep] = i;
tag_or[i] = last_or[deep];
tag_and[i] = last_and[deep];
}
cout << dfs(0, strlen(s) - 1) << endl << sum_and << ' ' << sum_or;
return 0;
}
这样做是对的
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e6 + 7;
char s[MAXN];
int sum_or, sum_and, tag_or[MAXN], tag_and[MAXN], last_or[MAXN], last_and[MAXN];
int len;
bool dfs(int l, int r) {
if (l == r)
return s[l] - '0';
if (s[l] == '(' && s[r] == ')')//这里
return dfs(l + 1, r - 1);
if (tag_or[r] > l) {
int tmp1 = dfs(l, tag_or[r] - 1);
if (tmp1) {
sum_or++;
return 1;
}
return dfs(tag_or[r] + 1, r);
}
if (tag_and[r] > l) {
int tmp1 = dfs(l, tag_and[r] - 1);
if (!tmp1) {
sum_and++;
return 0;
}
return dfs(tag_and[r] + 1, r);
}
}
signed main() {
freopen("expr4.in", "r", stdin);
scanf("%s", s);
int deep = 1;
len = strlen(s);
for (int i = 0; i < len; i++) {
if (s[i] == '(') deep++;
if (s[i] == ')') deep--;
if (s[i] == '|') last_or[deep] = i;
if (s[i] == '&') last_and[deep] = i;
tag_or[i] = last_or[deep];
tag_and[i] = last_and[deep];
}
cout << dfs(0, strlen(s) - 1) << endl << sum_and << ' ' << sum_or;
return 0;
}
把那块代码提前了一下,就WA了,这是为什么qwq