P8815 40pts烂代码求hack,或求调
#include<bits/stdc++.h>
#define MAXLEN 1000999
using namespace std;
string s;
char hz[MAXLEN];
stack<char> st;
int andskip,orskip;
int p;
struct num{
int n;
int ast;
int ost;
};
stack<num> cal;
int main(){
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='1'||s[i]=='0'){
hz[p++]=s[i];
}
if(s[i]=='('){
st.push('(');
}
if(s[i]==')'){
while(st.top()!='('){
hz[p++]=st.top();
st.pop();
}
st.pop();
}
if(s[i]=='&'){
if(st.empty())
st.push('&');
else if(st.top()=='(')
st.push('&');
else{
while(!st.empty()&&st.top()!='|'&&st.top()!='('){
hz[p++]=st.top();
st.pop();
}
st.push('&');
}
}
if(s[i]=='|'){
if(st.empty())
st.push('|');
else if(st.top()=='(')
st.push('|');
else{
while(!st.empty()&&st.top()!='('){
hz[p++]=st.top();
st.pop();
}
st.push('|');
}
}
}
while(!st.empty()){
hz[p++]=st.top();
st.pop();
}
for(int i=0;i<p;i++){
if(hz[i]=='1'||hz[i]=='0'){
num q;
q.n=hz[i]-'0';
q.ast=q.ost=0;
cal.push(q);
}
if(hz[i]=='&'){
int b=cal.top().n;
int bast=cal.top().ast;
int bost=cal.top().ost;
cal.pop();
int a=cal.top().n;
int aast=cal.top().ast;
int aost=cal.top().ost;
cal.pop();
if(a==0){
andskip++;
orskip-=bost;
andskip-=bast;
num res;
res.n=0;
res.ast=aast+1;
res.ost=aost;
cal.push(res);
}else{
num ans;
ans.n=a&b;
ans.ast=ans.ost=0;
cal.push(ans);
}
}
if(hz[i]=='|'){
int b=cal.top().n;
int bast=cal.top().ast;
int bost=cal.top().ost;
cal.pop();
int a=cal.top().n;
int aast=cal.top().ast;
int aost=cal.top().ost;
cal.pop();
if(a==1){
orskip++;
orskip-=bost;
andskip-=bast;
num res;
res.n=1;
res.ast=aast;
res.ost=aost+1;
cal.push(res);
}else{
num ans;
ans.n=a|b;
ans.ast=ans.ost=0;
cal.push(ans);
}
}
}
cout<<cal.top().n<<'\n'<<andskip<<' '<<orskip;
return 0;
}