#include<bits/stdc++.h>
using namespace std;
struct treeNode{
treeNode *lc;
treeNode *rc;
bool value;
int op1;
int op2;
char data;
treeNode(char c):data(c),lc(0),rc(0),value(0),op1(0),op2(0){
}
treeNode():lc(0),rc(0),value(0),op1(0),op2(0){
}
};
treeNode *root;
stack<treeNode*> jd;
stack<char> ysf;
string s;
void ys(){
treeNode *node,*n1,*n2;
n2=jd.top();
jd.pop();
n1=jd.top();
jd.pop();
node=new treeNode(ysf.top());
ysf.pop();
node->lc=n1;
node->rc=n2;
jd.push(node);
}
treeNode* buildTree(){
treeNode *node,*n1,*n2;
int i=0;
while(i<s.size()){
if(s[i]=='0'||s[i]=='1'){
node=new treeNode(s[i]);
jd.push(node);
}
else if(s[i]=='('){
ysf.push('(');
}
else if(s[i]==')'){
treeNode *n1,*n2;
while(ysf.top()!='('){
ys();
}
ysf.pop();
}
else if(s[i]=='|'){
while(ysf.size()>0&&ysf.top()!='('){
ys();
}
ysf.push(s[i]);
}
else if(s[i]=='&'){
while(ysf.size()>0&&ysf.top()=='&'){
ys();
}
ysf.push(s[i]);
}
i++;
}
while(ysf.size()>0){
ys();
}
return jd.top();
}
void traverseTree(treeNode *r){
if(r->data=='1') {
r->value=1;
return;
}
else if(r->data=='0') return;
else{
traverseTree(r->lc);
traverseTree(r->rc);
if(r->data=='|'){
r->value=(r->lc->value)|(r->rc->value);
if(r->lc->value) {
r->op2=r->lc->op2+1;
r->op1=r->lc->op1;
}
else{
r->op2=r->lc->op2+r->rc->op2;
r->op1=r->lc->op1+r->rc->op1;
}
}
else{
r->value=(r->lc->value)&(r->rc->value);
if(r->lc->value==0){
r->op1=r->lc->op1+1;
r->op2=r->lc->op2;
}
else{
r->op2=r->lc->op2+r->rc->op2;
r->op1=r->lc->op1+r->rc->op1;
}
}
}
}
int main(){
getline(cin,s);
root=buildTree();
traverseTree(root);
cout<<root->value<<endl;
cout<<root->op1<<" "<<root->op2;
return 0;
}