#include <bits/stdc++.h>
using namespace std;
struct Node {
int l = -1, r = -1;
char f = 0;
bool v;
};
Node node[2002000];
int ns;
string s;
int n;
inline int add_val(bool v) {
node[ns].v = v, node[ns].f = 0;
ns++;
return ns - 1;
}
int r;
int parse();
int pch() {
int idx;
if (s[r] == ')') {
r--;
idx = parse();
assert(s[r] == '(');
r--;
} else {
assert(s[r] == '0' || s[r] == '1');
bool v = s[r] - '0';
idx = add_val(v);
r--;
}
return idx;
}
int parse() {
assert(r >= 0);
Node t;
t.r = pch();
if (r < 0 || s[r] == '(') {
return t.r;
}
t.f = s[r--];
bool kd = (s[r] == ')');
t.l = parse();
node[ns++] = t;
if (node[ns - 1].l != -1 && !kd) {
int l = node[ns - 1].l;
if (node[ns - 1].f == '&' && node[l].f == '|') {
node[ns - 1].l = node[l].r;
node[l].r = ns - 1;
return l;
}
}
return ns - 1;
}
void dfs(int rt) {
if (node[rt].f) {
printf("(");
if (node[rt].l != -1) {
dfs(node[rt].l);
}
putchar(node[rt].f);
if (node[rt].r != -1) {
dfs(node[rt].r);
}
printf(")");
} else {
putchar('0' + node[rt].v);
}
}
int a1, a2;
bool calc(int rt) {
if (node[rt].f) {
bool l = calc(node[rt].l);
if (node[rt].f == '|' && l == 1) {
a2++;
return l;
} else if (node[rt].f == '&' && l == 0) {
a1++;
return l;
}
bool r = calc(node[rt].r);
if (node[rt].f == '|') {
return l || r;
} else if (node[rt].f == '&') {
return l && r;
}
printf("Panic : %d\n", node[rt].f);
exit(0);
} else {
return node[rt].v;
}
}
int main() {
cin >> s;
n = s.size();
r = n - 1;
int rt = parse();
int res = calc(rt);
printf("%d\n%d %d\n", res, a1, a2);
return 0;
}