欢迎光临散文网 会员登陆 & 注册

P8815-CSP-J-2022-3-LogicExpression逻辑表达式

2023-08-07 11:17 作者:信奥赛USACO郑老师  | 我要投稿

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXV=1e6;

struct node{

    char v;

    int l,r;

};

vector<node> g(MAXV);

int build_tree(string sl){

    int last=1;

    stack<int> st;

    for(int i=0;i<sl.size();i++){

        if(sl[i]=='0'||sl[i]=='1'){

            g[last].v=sl[i];

            st.push(last);

            last++;

        }

        if(sl[i]=='&'||sl[i]=='|'){

            int o2=st.top();

            st.pop();

            int o1=st.top();

            st.pop();

            g[last].l=o1;

            g[last].r=o2;

            g[last].v=sl[i];

            st.push(last);

            last++;

        }

    }

    return st.top();

}

int dfs(int root, int& a, int& b){

    if(g[root].l==0&&g[root].r==0){//leaf

        return g[root].v-'0';

    }

    int left=dfs(g[root].l,a,b);

    int ret=-1;

    if(g[root].v=='&'){

        if(left==0){

            a++;

            ret=0;

        }else{

            ret=dfs(g[root].r,a,b);

        }

    }else{

        if(g[root].v=='|'){

            if(left==1){

                b++;

                ret=1;

            }else{

                ret=dfs(g[root].r,a,b);

            }

        }

    }

    return ret;

}

string m2l(string s){

    string res;

    stack<char> st;

    for(int i=0;i<s.size();i++){

        char c=s[i];

        switch(c){

            case '0':

            case '1':

                res+=c;

                break;

            case '(':

                st.push(c);

                break;    

            case ')':

                while(st.top()!='('){

                    res+=st.top();

                    st.pop();

                }

                st.pop();

                break;

            case '&':

                while(st.size()>0&&st.top()!='|'&&st.top()!='('){

                    res+=st.top();

                    st.pop();

                }    

                st.push('&');

                break;

            case '|':

                while(st.size()>0&&st.top()!='('){

                    res+=st.top();

                    st.pop();

                }    

                st.push('|');

                break;

            default:

                cout<<"error1\n";

        }

    }

    while(st.size()>0){

        res+=st.top();

        st.pop();

    }

    return res;                    

}

int main(){

    string s,sl;

    cin>>s;

    sl=m2l(s);

    int root=build_tree(sl);

    int a=0,b=0;

    cout<<dfs(root,a,b)<<endl;

    cout<<a<<" "<<b<<endl;

    return 0;

}


P8815-CSP-J-2022-3-LogicExpression逻辑表达式的评论 (共 条)

分享到微博请遵守国家法律