模板栈,结果样例没过。。。
#include<bits/stdc++.h>
#define pii pair<bool,pair<int,int> >
#define same(a,b) !(a^b)
#define diff(a,b) a^b
using namespace std;
char str[1000010];
stack<pii> st1;
stack<char> st2;
int good(char c){
if(same(c,38)) return 2;
if(same(c,124)) return 1;
return 0;
}
void make(){
pii a=st1.top();
st1.pop();
pii b=st1.top();
st1.pop();
char c=st2.top();
st2.pop();
if(same(c,38)){
if(!a.first) st1.push(make_pair(0,make_pair(0,a.second.second+b.second.second)));
else st1.push(make_pair(a.first&&b.first,make_pair(a.second.first+b.second.first,a.second.second+b.second.second)));
}else{
if(a.first) st1.push(make_pair(1,make_pair(a.second.first+b.second.first,1)));
else st1.push(make_pair(a.first||b.first,make_pair(a.second.first+b.second.first,a.second.second+b.second.second)));
}
}
int main(){
scanf("%s",str);
int len=strlen(str);
for(int i=0;i<len;i++){
char c=str[i];
if(same(c,48)) st1.push(make_pair(0,make_pair(0,0)));
else if(same(c,49)) st1.push(make_pair(1,make_pair(0,0)));
else if(same(c,40)) st2.push(40);
else if(same(c,41)){
while(diff(st2.top(),40)) make();
st2.pop();
}else{
while(!st2.empty()&&good(st2.top())>=good(c)) make();
st2.push(c);
}
}
while(!st2.empty()) make();
pii ans=st1.top();
if(ans.first) putchar(49);
else putchar(48);
printf("\n%d %d",ans.second.first,ans.second.second);
return 0;
}