#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
int dp1[maxn][3];//1 : red, 2 : green, 3 : blue
int dp2[maxn][3];//1 : red, 2 : green, 3 : blue
vector<int> G[maxn];
int tot = 1;
int cnt = 0;
int read(int now, int t, string s){
if(s[t] == '0') return now;
if(s[t] == '1') {
G[now].push_back(read(++tot, ++cnt, s));
return now;
}
if(s[t] == '2'){
G[now].push_back(read(++tot, ++cnt, s));
G[now].push_back(read(++tot, ++cnt, s));
return now;
}
}
void dfs1(int u, int fa){
dp1[u][0] = 0;
dp1[u][1] = 1;
dp1[u][2] = 0;
dp2[u][0] = 0;
dp2[u][1] = 1;
dp2[u][2] = 0;
if(G[u].size() == 0) return;
else if(G[u].size() == 1){
int v = G[u][0];
dfs1(v, u);
dp1[u][1] += max(dp1[v][0], dp1[v][2]);
dp1[u][2] += max(dp1[v][1], dp1[v][0]);
dp1[u][0] += max(dp1[v][1], dp1[v][2]);
dp2[u][1] += min(dp2[v][0], dp2[v][2]);
dp2[u][2] += min(dp2[v][1], dp2[v][0]);
dp2[u][0] += min(dp2[v][1], dp2[v][2]);
}
else{
int v1 = G[u][0], v2 = G[u][1];
dfs1(v1, u);
dfs1(v2, u);
dp1[u][1] += max(dp1[v1][0] + dp1[v2][2], dp1[v1][2] + dp1[v2][0]);
dp1[u][2] += max(dp1[v1][1] + dp1[v2][0], dp1[v1][0] + dp1[v2][1]);
dp1[u][0] += max(dp1[v1][1] + dp1[v2][2], dp1[v1][2] + dp1[v2][1]);
dp2[u][1] += min(dp2[v1][0] + dp2[v2][2], dp2[v1][2] + dp2[v2][0]);
dp2[u][2] += min(dp2[v1][1] + dp2[v2][0], dp2[v1][0] + dp2[v2][1]);
dp2[u][0] += min(dp2[v1][1] + dp2[v2][2], dp2[v1][2] + dp2[v2][1]);
}
}
int main(){
// freopen("3color.in", "r", stdin);
// freopen("3color.out", "w", stdout);
string s;
cin >> s;
read(1, 0, s);
dfs1(1, 0);
cout << max({dp1[1][0], dp1[1][1], dp1[1][2]}) << " " << min({dp2[1][1], dp2[1][0], dp2[1][2]});
return 0;
}
MLE 2 个点