比赛 CSP2022普及组 评测结果 RRRRRRRRRRRRRRRRRRRR
题目名称 逻辑表达式 最终得分 0
用户昵称 zzafanti 运行时间 0.010 s
代码语言 C++ 内存使用 5.74 MiB
提交时间 2022-10-29 16:23:33
显示代码纯文本
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int UI;

ll read(){
    ll sgn=0,x=0;
    char c=getchar();
    while(!isdigit(c)) sgn|=(c=='-'),c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    return sgn?-x:x;
}

struct res{
    bool num;
    int c1,c2;
};

string Change(string &str){
    string s;
    stack<char> stk;
    for(int i=0; i<str.size(); i++){
        if(isdigit(str[i])){
            s+=str[i];
            continue;
        }
        if(str[i]=='('){
            stk.push('(');
            continue;
        }
        if(str[i]==')'){
            while(stk.size()&&stk.top()!='('){
                char c=stk.top();
                s+=c;
                stk.pop();
            }
            if(stk.size()) stk.pop();
            continue;
        }
        if(str[i]=='&'){
            while(stk.size()&&stk.top()!='('&&stk.top()!='|')
            {
                s+=stk.top();
                stk.pop();
            }
            stk.push('&');
            continue;
        }
        if(str[i]=='|')
        {
            while(stk.size()&&stk.top()!='(')
            {
                s+=stk.top();
                stk.pop();
            }
            stk.push('|');
        }
    }
    while(stk.size()){
        s+=stk.top();
        stk.pop();
    }
    return s;
}

void Calu(string &s){
    //cout<<s<<endl;
    stack<res> stk;
    for(int i=0; i<s.size(); i++){
        if(isdigit(s[i])){
            stk.push((res){s[i]-'0',0,0});
            continue;
        }
        res x,y;
        y=stk.top(); stk.pop();
        x=stk.top(); stk.pop();
        if(s[i]=='&'){
            if(!x.num){
                stk.push((res){0,x.c1+1,x.c2});
            }
            else{
                stk.push((res){x.num&y.num,x.c1+y.c1,x.c2+y.c2});
            }
        }
        if(s[i]=='|'){
            if(x.num){
                stk.push((res){1,x.c1,x.c2+1});
            }
            else{
                stk.push(res{x.num|y.num,x.c1+y.c1,x.c2+y.c2});
            }
        }
    }
    cout<<stk.top().num<<'\n';
    cout<<stk.top().c1<<' '<<stk.top().c2<<'\n';
}

int main(){

    string str;
    cin>>str;

    str=Change(str);

    Calu(str);

    return 0;
}
/*
1|0&1
*/