比赛 |
CSP2022普及组 |
评测结果 |
AAAAAAAWWWAAAAAAAWWW |
题目名称 |
逻辑表达式 |
最终得分 |
70 |
用户昵称 |
yrtiop |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2022-10-29 17:32:37 |
显示代码纯文本
#include <bits/stdc++.h>
#define fir first
#define sec second
typedef std::pair<int,int> pii;
const int maxn = 1e6 + 5;
char s[maxn];
int ans,sum,n;
pii calc(int x) {
int lst = 0;
if(s[x] == '(') {
pii p = calc(x + 1);
lst = p.fir;
x = p.sec + 1;
}
else {
lst = s[x] ^ '0';
x += 2;
}
for(;x <= n;) {
while(s[x] == '(') {
if(lst == 1&&s[x - 1] == '|') {
++ sum;
int cnt = 1;
for(++ x;cnt > 0&&x <= n;++ x) {
cnt += s[x] == '(';
cnt -= s[x] == ')';
}
if(x > n)return {lst , x};
++ x;
}
else if(lst == 0&&s[x - 1] == '&') {
++ ans;
int cnt = 1;
for(++ x;cnt > 0&&x <= n;++ x) {
cnt += s[x] == '(';
cnt -= s[x] == ')';
}
if(x > n)return {lst , x};
++ x;
}
else {
pii p = calc(x + 1);
if(s[x - 1] == '&')lst = lst & p.fir;
else lst = lst | p.fir;
x = p.sec + 1;
}
if(x > n)return {lst , x};
}
if(x > n)return {lst , x};
if(s[x - 1] == ')')return {lst , x};
if(s[x] == ')')return {lst , x + 1};
if(s[x - 1] == '&') {
ans += !lst;
lst &= s[x] ^ '0';
x += 2;
}
else {
if(lst) {
for(;x <= n&&s[x + 1] == '&';x += 2);
x += 2;
++ sum;
}
else {
int val = s[x] ^ '0';
for(;x <= n&&s[x + 1] == '&';) {
x += 2;
if(!val)++ ans;
val &= s[x] ^ '0';
}
lst |= val;
x += 2;
}
}
// if(s[x - 1] == '|'&&lst) {
// ++ sum;
// x += 2;
// }
// else {
// if(s[x - 1] == '&')lst &= s[x] ^ '0';
// else lst |= s[x] ^ '0';
// x += 2;
// }
}
return {lst , x};
}
int main() {
freopen("csp2022pj_expr.in","r",stdin);
freopen("csp2022pj_expr.out","w",stdout);
scanf("%s",s + 1);
n = strlen(s + 1);
printf("%d\n",calc(1).fir);
printf("%d %d\n",ans,sum);
return 0;
}