#include <iostream>
#include <cmath>
#define int short
using namespace std;
string s;
long long andsum,orsum,ll,rr;
int find(char ch,int l,int r){//寻找最后一个不在括号内的字符(&和|)
int res=0;
for(long long i=r;i>=l;i--){
if(s[i]==')')res++;
if(s[i]=='(')res--;
if(s[i]==ch&&res==0)return i;
}
return -1;
}
int dfs(long long l,long long r){
//cout<<"dfsed "<<l<<" "<<r<<endl;
if(s[l]=='('&&s[r]==')'){//去除括号
if(l==ll)ll++;
if(r==rr)rr--;
int ret=dfs(l+1,r-1);
return ret;
}
if(l==r)return s[l]-'0';//单个数字的特判
long long fff;
char wf;
fff=find('|',l,r);//寻找最后一个“|”
wf='|';
if(fff==-1){
fff=find('&',l,r);//找不到“|”时找“&”
wf='&';
}
if(fff==-1)return 1/0;//这是找不到|找不到&的情况,才会RE++++++++++++++++++++++++++++++++++++++++
int dfl,dfr;
dfl=dfs(max(l,ll),fff-1);
//if(l==1&&r==3)cout<<"sd"<<dfl<<" "<<dfr<<"gf";
//if(l==1&&r==3)cout<<wf<<"kzisgviys";
if(wf=='|'){//当找到|
if(dfl==1){//短路
orsum++;
return 1;
}
else{
dfr=dfs(fff+1,min(r,rr));
}
return dfl|dfr;
}
if(wf=='&'){//当找到&
if(dfl==0){//短路
andsum++;
return 0;
}
else{
dfr=dfs(fff+1,min(r,rr));
}
return dfl𝔡
}
}
signed main(){
cin>>s;
rr=s.length()-1;
cout<<dfs(0,s.length()-1)<<endl<<andsum<<" "<<orsum;
return 0;
}
(RE是我在33行加的,为了方便寻找注释了一些加好) 题目:P8815