#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define top_num 2
#define min_top 0
#define max_top 1
#define is_green 0
#define no_green 1
#define MAX_NUM(x, y) ((x) > (y) ? (x) : (y))
#define MIN_NUM(x, y) ((x) < (y) ? (x) : (y))
int main()
{
int i, len, top[top_num];
int isa, noa, isb, nob;
int min_num, max_num;
int stack[top_num][2][10010];
char *p, str[10010];
while(scanf("%s", str) != EOF)
{
len = strlen(str);
p = &str[len - 1];
top[min_top] = top[max_top] = 0;
for (i = 0; i < len; ++i, --p)
{
switch(*p)
{
case '0':
stack[min_top][is_green][top[min_top]] = 1;
stack[min_top][no_green][top[min_top]] = 0;
++top[min_top];
stack[max_top][is_green][top[max_top]] = 1;
stack[max_top][no_green][top[max_top]] = 0;
++top[max_top];
break;
case '1':
--top[min_top];
isa = stack[min_top][is_green][top[min_top]];
noa = stack[min_top][no_green][top[min_top]];
stack[min_top][is_green][top[min_top]] = noa + 1;
stack[min_top][no_green][top[min_top]] = MIN_NUM(isa, noa);
++top[min_top];
--top[max_top];
isa = stack[max_top][is_green][top[max_top]];
noa = stack[max_top][no_green][top[max_top]];
stack[max_top][is_green][top[max_top]] = noa + 1;
stack[max_top][no_green][top[max_top]] = MAX_NUM(isa, noa);
++top[max_top];
break;
case '2':
--top[min_top];
isa = stack[min_top][is_green][top[min_top]];
noa = stack[min_top][no_green][top[min_top]];
--top[min_top];
isb = stack[min_top][is_green][top[min_top]];
nob = stack[min_top][no_green][top[min_top]];
stack[min_top][is_green][top[min_top]] = noa + nob + 1;
stack[min_top][no_green][top[min_top]] = MIN_NUM(isa + nob, isb + noa);
++top[min_top];
--top[max_top];
isa = stack[max_top][is_green][top[max_top]];
noa = stack[max_top][no_green][top[max_top]];
--top[max_top];
isb = stack[max_top][is_green][top[max_top]];
nob = stack[max_top][no_green][top[max_top]];
stack[max_top][is_green][top[max_top]] = noa + nob + 1;
stack[max_top][no_green][top[max_top]] = MAX_NUM(isa + nob, isb + noa);
++top[max_top];
break;
default:
break;
}
}
--top[min_top];
isa = stack[min_top][is_green][top[min_top]];
noa = stack[min_top][no_green][top[min_top]];
min_num = MIN_NUM(isa, noa);
--top[max_top];
isa = stack[max_top][is_green][top[max_top]];
noa = stack[max_top][no_green][top[max_top]];
max_num = MAX_NUM(isa, noa);
printf("%d %d\n", max_num, min_num);
}
return 0;
}