status
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int MAXN = 5e5 + 10;
int s[MAXN][2];
char a[MAXN], p;
int f[MAXN][4], g[MAXN][4];
void build() {
int i = p;
if (a[i] == '1') {
s[i][0] = p + 1;
p++; build();
}
if (a[i] == '2') {
s[i][0] = p + 1;
p++; build();
s[i][1] = p + 1;
p++; build();
}
}
void dp(int u) {
if (!s[u][0]) {
f[u][0] = g[u][0] = 1;
f[u][2] = g[u][2] = f[u][1] = g[u][1] = 0;
return;
}
dp(s[u][0]);
if (s[u][1]) {
dp(s[u][1]);
}
f[u][0] = max(f[s[u][0]][2] + f[s[u][1]][1], f[s[u][0]][1] + f[s[u][1]][2]) + 1;
f[u][2] = max(f[s[u][0]][1] + f[s[u][1]][0], f[s[u][0]][0] + f[s[u][1]][1]);
f[u][1] = max(f[s[u][0]][2] + f[s[u][1]][0], f[s[u][0]][0] + f[s[u][1]][2]);
g[u][0] = min(g[s[u][0]][2] + g[s[u][1]][1], g[s[u][0]][1] + g[s[u][1]][2]) + 1;
g[u][2] = min(g[s[u][0]][1] + g[s[u][1]][0], g[s[u][0]][0] + g[s[u][1]][1]);
g[u][1] = min(g[s[u][0]][2] + g[s[u][1]][0], g[s[u][0]][0] + g[s[u][1]][2]);
}
signed main() {
scanf("%s", a + 1);
p = 1;
build();
dp(1);
int ans = max(max(f[1][1], f[1][2]), f[1][0]);
printf("%lld ", ans);
ans = min(min(g[1][1], g[1][2]), g[1][0]);
printf("%lld\n", ans);
return 0;
}