#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000050;
char ai[maxn];
short dp[maxn*140][3];
short dpp[maxn*140][3];
bool f[maxn*140];
int cnt;
bool flag[maxn*140];
void dfs(int k,int mark){
if(ai[k]=='0') return ;
if(ai[k]=='1') {
flag[mark<<1]=1;
dfs(++cnt,mark<<1);
}
if(ai[k]=='2') {
flag[mark<<1]=1;
flag[mark<<1|1]=1;
dfs(++cnt,mark<<1);
dfs(++cnt,mark<<1|1);
}
}
void dppp(int k){
f[k]=1;
if(!flag[k<<1]&&!flag[k<<1|1]) {dp[k][0]=1;dpp[k][0]=1;return ;}
if(flag[k<<1]&&!f[k<<1]) dppp(k<<1);
if(flag[k<<1|1]&&!f[k<<1|1]) dppp(k<<1|1);
if(flag[k<<1|1]&&flag[k<<1]){
dp[k][0] = max(dp[k<<1][1] + dp[k<<1|1][2], dp[k<<1][2] + dp[k<<1|1][1]) + 1;
dp[k][1] = max(dp[k<<1][0] + dp[k<<1|1][2], dp[k<<1][2] + dp[k<<1|1][0]);
dp[k][2] = max(dp[k<<1][0] + dp[k<<1|1][1], dp[k<<1][1] + dp[k<<1|1][0]);
dpp[k][0] = min(dpp[k<<1][1] + dpp[k<<1|1][2], dpp[k<<1][2] + dpp[k<<1|1][1]) + 1;
dpp[k][1] = min(dpp[k<<1][0] + dpp[k<<1|1][2], dpp[k<<1][2] + dpp[k<<1|1][0]);
dpp[k][2] = min(dpp[k<<1][0] + dpp[k<<1|1][1], dpp[k<<1][1] + dpp[k<<1|1][0]);
}
else if(flag[k<<1]){
dp[k][0] = max(dp[k<<1][1],dp[k<<1][2])+1;
dp[k][1] = max(dp[k<<1][0],dp[k<<1][2]);
dp[k][2] = max(dp[k<<1][0],dp[k<<1][1]);
dpp[k][0] = min(dpp[k<<1][1],dpp[k<<1][2])+1;
dpp[k][1] = min(dpp[k<<1][0],dpp[k<<1][2]);
dpp[k][2] = min(dpp[k<<1][0],dpp[k<<1][1]);
}
}
int main(){
scanf("%s",ai+1);
dfs(++cnt,1);
dppp(1);
cout<<max(dp[1][0],max(dp[1][1],dp[1][2]));
cout<<" ";
cout<<min(dpp[1][0],min(dpp[1][1],dpp[1][2]));
}