比赛 CSP2022普及组 评测结果 AWAWEEAEEEEEEEAAAEEE
题目名称 逻辑表达式 最终得分 30
用户昵称 在大街上倒立游泳 运行时间 2.505 s
代码语言 C++ 内存使用 4.57 MiB
提交时间 2022-10-29 16:43:25
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
bool s1,s2;
char fz;
int s2d1,s2d2,s1d1,s1d2,ans1,ans2;
int zhi(char f)
{
	if(f=='(') return 0;
	if(f=='|') return 1;
	if(f=='&') return 2;
}
int main()
{
	freopen("csp2022pj_expr.in","r",stdin);
	freopen("csp2022pj_expr.out","w",stdout);
	string s;
	cin>>s;
	s='('+s+')';
	stack<int> shu,d1,d2;
	stack<char> fh;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='0'||s[i]=='1') 
		{
			shu.push(s[i]-48);
			d1.push(0);
			d2.push(0);
		}
		else
		{
			if(zhi(s[i])==')')
			{
				while(fh.top()!='(')
				{
					s2=shu.top();
					shu.pop();
					s2d1=d1.top();
					d1.pop();
					s2d2=d2.top();
					d2.pop();
					s1=shu.top();
					shu.pop();
					s1d1=d1.top();
					d1.pop();
					s1d2=d2.top();
					d2.pop();
					fz=fh.top();
					fh.pop();
					if(fz=='|') 
					{
						shu.push(s1|s2);
						if(s1==1) 
						{
							ans2++;
							s1d2++;
							ans1-=s2d1;
							ans2-=s2d2;
							d1.push(s1d1);
							d2.push(s1d2);
						}
						else
						{
							d1.push(s1d1+s2d1);
							d2.push(s1d2+s2d2);
						}
					}
					else
					{
						shu.push(s1&s2);
						if(s1==0)
						{
							ans1++;
							s1d1++;
							ans1-=s2d1;
							ans2-=s2d2;
							d1.push(s1d1);
							d2.push(s1d2);
						}
						else
						{
							d1.push(s1d1+s2d1);
							d2.push(s1d2+s2d2);
						}
					}
				}
				fh.pop();
			}
			else if(s[i]=='(') fh.push(s[i]);
			else
			{
				if(fh.empty()) 
				{
					fh.push(s[i]);
					continue;
				}
				while(zhi(fh.top())>=zhi(s[i]))
				{
					s2=shu.top();
					shu.pop();
					s2d1=d1.top();
					d1.pop();
					s2d2=d2.top();
					d2.pop();
					s1=shu.top();
					shu.pop();
					s1d1=d1.top();
					d1.pop();
					s1d2=d2.top();
					d2.pop();
					fz=fh.top();
					fh.pop();
					if(fz=='|') 
					{
						shu.push(s1|s2);
						if(s1==1) 
						{
							ans2++;
							s1d2++;
							ans1-=s2d1;
							ans2-=s2d2;
							d1.push(s1d1);
							d2.push(s1d2);
						}
						else
						{
							d1.push(s1d1+s2d1);
							d2.push(s1d2+s2d2);
						}
					}
					else
					{
						shu.push(s1&s2);
						if(s1==0)
						{
							ans1++;
							s1d1++;
							ans1-=s2d1;
							ans2-=s2d2;
							d1.push(s1d1);
							d2.push(s1d2);
						}
						else
						{
							d1.push(s1d1+s2d1);
							d2.push(s1d2+s2d2);
						}
					}
					if(fh.empty()) break;
				}
				fh.push(s[i]);
			}
		}
	}
	cout<<shu.top()<<endl<<ans1<<' '<<ans2; 
    return 0;
}