55分RE求调
查看原帖
55分RE求调
1406565
LYD12345楼主2025/2/2 14:23
#include <bits/stdc++.h>
using namespace std;

char n[100000010];
int c1=0;
int c2=0;

int num[100000010];
int tn=0;
char op[100000010];
int to=0;

void eval(){
	
	char o=op[to];to--;
	int n1=num[tn];tn--;
	if(num[tn]==100)	return;
	int n2=num[tn];tn--;
	if(o=='|'){
		if(n2==1){
			c2++;
		}
		num[++tn]=(n2|n1);
	}else{
		if(n2==0){
			c1++;
		}
		num[++tn]=(n2&n1);
	}
	
}

int main(){
	
	op[++to]=('@');
	num[++tn]=100;
	scanf("%s", n+1);
	int s=strlen(n+1);
	for(int i=1;i<=s;i++){
		if(isdigit(n[i])){
			num[++tn]=(n[i]-'0');
		}else if(n[i]=='('){
			if(op[to]!='@' && ((op[to]=='|' && num[tn]==1) || (op[to]=='&' && num[tn]==0))){
				if(op[to]=='|'){
					c2++;
				}else{
					c1++;
				}
				to--;
				int cnt=1;
				int j=i;
				while(cnt){
					j++;
					if(n[j]=='('){
						cnt++;
					}
					if(n[j]==')'){
						cnt--;
					}
				}
				i=j;
			}else{
				op[++to]=('(');
			}
		}else if(n[i]==')'){
			while(op[to]!='@' && op[to]!='('){
				eval();
			}
			to--;
		}else{
			while(op[to]!='@' && op[to]!='('){
				if(n[i]=='|'){
					eval();
				}else if(op[to]=='&'){
					eval();
				}else{
					break;
				}
			}
			if(n[i]=='|' && num[tn]!=100 && num[tn]==1){
				int j=i+1;
				int cnt=0;
				while(j<=s && (isdigit(n[j]) || n[j]=='&' || n[j]=='(') && cnt>=0){
					j++;
					if(n[j]=='(')	cnt++;
					else if(n[j]==')')	cnt--;
				}
				c2++;
				i=j-1;
			}else{
				op[++to]=(n[i]);
			}
		}
	}
	while(op[to]!='@'){
		eval();
	}
	printf("%d\n%d %d", num[tn], c1, c2);
	
	return 0;
	
}
2025/2/2 14:23
加载中...