记录编号 |
577303 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[CSP 2022J]逻辑表达式 |
最终得分 |
100 |
用户昵称 |
在大街上倒立游泳 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.185 s |
提交时间 |
2022-10-31 08:29:33 |
内存使用 |
3.11 MiB |
显示代码纯文本
#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;
}