记录详情
#include<bits/stdc++.h>
typedef long long ll;
const int INF=2e8;
const ll LLINF=LLONG_MAX;
const int N=1000007;
using namespace std;
void swap(int &a,int &b);
inline int read();
inline int write(int);
char s[N],e[N];
stack<char> op;
stack<int> st;
int lchild[N],rchild[N];
//bool data[N];
int data[N];
int sc1[N];
int sc2[N];
int find_data(int i)
{
if(rchild[i]==-1||lchild[i]==-1)
{
sc1[i]=0;
sc2[i]=0;
data[i]=e[i]-48;
return 0;
}
find_data(lchild[i]);
find_data(rchild[i]);
/*if(e[i]=='|'&&data[lchild[i]]==1)
sc1[i]=sc1[lchild[i]]+1,
sc2[i]=sc2[lchild[i]];
if(e[i]=='&'&&data[lchild[i]]==0)
sc2[i]=sc2[lchild[i]]+1,
sc1[i]=sc1[lchild[i]];
if(e[i]=='|')
data[i]=(data[lchild[i]]||data[rchild[i]]);
if(e[i]=='&')
data[i]=(data[lchild[i]]&&data[rchild[i]]);
*/
if(e[i]=='|')
{
sc2[i]=sc2[lchild[i]]+sc2[rchild[i]];
if(data[lchild[i]]==1)
sc1[i]=sc1[lchild[i]]+1;
else
sc1[i]=sc1[lchild[i]]+sc1[rchild[i]];
data[i]=(data[lchild[i]]||data[rchild[i]]);
return 0;
}
if(e[i]=='&')
{
sc1[i]=sc1[lchild[i]]+sc1[rchild[i]];
if(data[lchild[i]]==0)
sc2[i]=sc2[lchild[i]]+1;
else
sc2[i]=sc2[lchild[i]]+sc2[rchild[i]];
data[i]=(data[lchild[i]]&&data[rchild[i]]);
return 0;
}
write(114514);
exit(-1);
}
int main(int argc,char **argv)
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
scanf("%s",s);
int j=0;
memset(lchild,-1,sizeof(lchild));
memset(rchild,-1,sizeof(rchild));
for(int i=0;i<strlen(s);i++)
{
if(isdigit(s[i]))
{
e[j++]=s[i];
continue;
}
if(op.empty())
{
op.push(s[i]);
continue;
}
if((s[i]=='&'&&op.top()=='|')||s[i]=='(')
{
op.push(s[i]);
continue;
}
if(s[i]==')')
{
while(op.top()!='(')
{
e[j++]=op.top();
op.pop();
}
op.pop();
continue;
}
if(op.top()=='(')
{
op.push(s[i]);
continue;
}
while(op.top()!='(')
{
e[j++]=op.top();
op.pop();
if(op.empty())break;
}
op.push(s[i]);
}
//printf("%s\n",e);
while(!op.empty())
{
e[j++]=op.top();
op.pop();
}
//printf("%s\n",e);
/*
for(int i=0;i<strlen(e);i++)
{
if(isdigit(e[i]))
{
st.push(e[i]-48);
continue;
}
int x=st.top()-48;st.pop();
int y=st.top()-48;st.pop();
if(e[i]=='|')st.push(x||y);
if(e[i]=='&')st.push(x&&y);
}
write(st.top());
putchar(10);
st.pop();*/
for(int i=0;i<strlen(e);i++)
{
if(isdigit(e[i]))
{
st.push(i);
continue;
}
rchild[i]=st.top();st.pop();
lchild[i]=st.top();st.pop();
st.push(i);
}
find_data(strlen(e)-1);
//for(int i=0;i<strlen(e);i++)
//write((int)data[i]);
//putchar(10);
//for(int i=0;i<strlen(e);i++)
//write(0);
//putchar(10);
write(data[strlen(e)-1]);
putchar(10);
write(sc2[strlen(e)-1]);
putchar(32);
write(sc1[strlen(e)-1]);
putchar(10);
/*printf("%s\n",e);
for(int i=0;i<strlen(e);i++)
write(sc1[i]);
putchar(32);
putchar(10);
for(int i=0;i<strlen(e);i++)
write(sc2[i]);
putchar(32);;*/
return 0;
}
inline int read()
{
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline int write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return x;
}
void swap(int &a,int &b)
{
a = a^b;
b = a^b;
a = a^b;
}