#include <iostream>
#include <vector>
using namespace std;
const int kMaxN = 5e5 + 1;
int c = 1, n, f[2][kMaxN][2];
string s;
vector<int> g[kMaxN];
void Build() {
int now = c;
char i;
cin >> i, n++;
if (i == '0') {
return;
}
if (i == '1') {
g[now].push_back(++c);
Build();
} else {
g[now].push_back(++c);
Build();
g[now].push_back(++c);
Build();
}
}
void dfs(int x) {
for (int i : g[x]) {
dfs(i);
}
if (!g[x].size()) {
f[0][x][0] = 0, f[0][x][1] = 1;
f[1][x][1] = 1, f[1][x][0] = 0;
} else if (g[x].size() == 1) {
f[0][x][0] = max(f[0][g[x][0]][1], f[0][g[x][0]][0]);
f[0][x][1] = f[0][g[x][0]][0] + 1;
f[1][x][0] = min(f[1][g[x][0]][0], f[1][g[x][0]][1]);
f[1][x][1] = f[0][g[x][0]][0] + 1;
} else {
f[0][x][1] = f[0][g[x][0]][0] + f[0][g[x][1]][0] + 1;
f[1][x][1] = f[1][g[x][0]][0] + f[1][g[x][1]][0] + 1;
f[0][x][0] = max(f[0][g[x][0]][0] + f[0][g[x][1]][1], f[0][g[x][0]][1] + f[0][g[x][1]][0]);
f[1][x][0] = min(f[1][g[x][0]][0] + f[1][g[x][1]][1], f[1][g[x][0]][1] + f[1][g[x][1]][0]);
}
}
int main() {
Build();
dfs(1);
cout << max(f[0][1][0], f[0][1][1]) << ' ' << min(f[1][1][0], f[1][1][1]);
return 0;
}