记录编号 |
577520 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[CSP 2022J]逻辑表达式 |
最终得分 |
100 |
用户昵称 |
00000 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.352 s |
提交时间 |
2022-11-07 23:06:33 |
内存使用 |
23.17 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int stkn[2000000],n,p;
char stkp[2000000];
int cnt,val[2000000],op[2000000],ls[2000000],rs[2000000];
int ans[5];
void cop()
{
char c=stkp[p--];
int r=stkn[n--],l=stkn[n--];
op[++cnt]=( c=='|' );//&=0 |=1 数字= -1
ls[cnt]=l;rs[cnt]=r;
val[cnt]= (c=='|'? (val[l]|val[r]) : (val[l]&val[r]) );
stkn[++n]=cnt;
}
void dfs(int x)
{
if(op[x]==0)//&
{
if(!val[ls[x]]) ans[1]++,dfs(ls[x]);
else dfs(ls[x]),dfs(rs[x]);
}
if(op[x]==1)//|
{
if(val[ls[x]]) ans[2]++,dfs(ls[x]);
else dfs(ls[x]),dfs(rs[x]);
}
}
int main(){
freopen("csp2022pj_expr.in","r",stdin);
freopen("csp2022pj_expr.out","w",stdout);
cin>>s;
s='('+s+')';
for(int q=0;q<s.length();q++)
{
if(s[q]=='(') stkp[++p]=s[q];
if(s[q]=='&')
{
while(stkp[p]=='&') cop();
stkp[++p]=s[q];
}
if(s[q]=='|')
{
while(stkp[p]!='(') cop();
stkp[++p]=s[q];
}
if(s[q]==')')
{
while(stkp[p]!='(') cop();
p--;
}
if(s[q]=='0'||s[q]=='1')
{
cnt++;
val[cnt]=s[q]-'0';
op[cnt]=-1;
stkn[++n]=cnt;
}
}
dfs(stkn[n]);
cout<<val[stkn[n]]<<endl;
cout<<ans[1]<<" "<<ans[2]<<endl;
return 0;
}