#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;
}