比赛 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;
}