1145141918
2025-07-29 21:01:05
发布于:江苏
#include<bits/stdc++.h>
using namespace std;
string s;
struct node{
int x,cnt1,cnt2;
};
stack<node>num;
stack<char>op;
int level(char op){
if(op=='|'){
return 1;
}if(op=='&'){
return 2;
}if(op=='(')return 0;
}
int main(){
freopen("expr.in","r",stdin);
freopen("expr.out","w",stdout);
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='1'||s[i]=='0'){
num.push((node){s[i]-'0',0,0});
}else if(s[i]=='(')op.push('(');
else if(s[i]==')'){
while(op.top()!='('){
node b=num.top();num.pop();
node a=num.top();num.pop();
if(op.top()=='&'){
if(a.x==0){
num.push((node){a.x&b.x,a.cnt1+1,a.cnt2});
}
else num.push((node){a.x&b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}else{
if(a.x==1){
num.push((node){a.x|b.x,a.cnt1,a.cnt2+1});
}
else num.push((node){a.x|b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}
op.pop();
}
op.pop();
}else{
while(op.size()&&level(op.top())>=level(s[i])){
node b=num.top();num.pop();
node a=num.top();num.pop();
if(op.top()=='&'){
if(a.x==0){
num.push((node){a.x&b.x,a.cnt1+1,a.cnt2});
}
else num.push((node){a.x&b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}else{
if(a.x==1){
num.push((node){a.x|b.x,a.cnt1,a.cnt2+1});
}
else num.push((node){a.x|b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}
op.pop();
}op.push(s[i]);
}
}while(op.size()){
node b=num.top();num.pop();
node a=num.top();num.pop();
if(op.top()=='&'){
if(a.x==0){
num.push((node){a.x&b.x,a.cnt1+1,a.cnt2});
}
else num.push((node){a.x&b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}else{
if(a.x==1){
num.push((node){a.x|b.x,a.cnt1,a.cnt2+1});
}
else num.push((node){a.x|b.x,a.cnt1+b.cnt1,a.cnt2+b.cnt2});
}
op.pop();
}cout<<num.top().x<<"\n"<<num.top().cnt1<<' '<<num.top().cnt2;
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个