/*
TASK: hexa
LANG: C
*/
#include<stdio.h>
#include<stdlib.h>
#define mx 1048576
#define type long long
#define in stdin;//fopen("c:\\a\\hexa.in","r")
FILE*fn;
int wh[6][2][2]={{{0,0},{0,0}},
		 {{1,1},{1,0}},
		 {{-1,1},{-1,0}},
		 {{0,0},{0,0}},
		 {{-1,0},{-1,-1}},
		 {{1,0},{1,-1}},
		};

int w[6][2][2][2]={{{{-1,1},{-1,0}},{{-1,0},{-1,-1}}},
		   {{{1,1},{2,0}},{{1,0},{2,0}}},
		   {{{-2,0},{-1,1}},{{-2,0},{-1,0}}},
		   {{{1,0},{1,1}},{{1,-1},{1,0}}},
		   {{{-1,0},{-2,0}},{{-1,-1},{-2,0}}},
		   {{{2,0},{1,0}},{{2,0},{1,-1}}}};
typedef struct {int x,y;}p;
p inner[mx];
p outer[mx];
int ic,oc;
char s[mx];
char a;
int q1;
int dir,x,y,x1,y1,i,o;
p e1;
int cmp(const void*a,const void*b)
  {if( (*((type*)a))>(*((type*)b)))return 1;
  else if((*((type*)a))==(*((type*)b)))return 0;
  return -1;}
int main()
  {fn=in;
  do{if(fscanf(fn,"%c",&a)<1)break;
    if(a!='1'&&a!='2')break;
    s[q1++]=a;}
    while(1);
  fclose(fn);
  x=0;
  y=0;
  dir=5;
  for(q1=0;s[q1];q1++)
    {x1=x;
    if(s[q1]=='2')
      {e1.x=x+wh[dir][(x1+2*mx)%2][0];
      e1.y=y+wh[dir][(x1+2*mx)%2][1];
      inner[ic++]=e1;}
    x1=x;
    x+=w[dir][(x1+mx*2)%2][s[q1]-49][0];
    y+=w[dir][(x1+mx*2)%2][s[q1]-49][1];
    if(s[q1]=='2')dir=(dir+5)%6;else dir=(dir+7)%6;}


  qsort(inner,ic,sizeof(inner[0]),cmp);

  x=0;
  y=0;
  dir=0;
  for(q1=0;s[q1];q1++)
    {x1=x;
    if(s[q1]=='1')
      {e1.x=x+wh[dir][(x1+2*mx)%2][0];
      e1.y=y+wh[dir][(x1+2*mx)%2][1];
      outer[oc++]=e1;}
    x1=x;
    x+=w[dir][(x1+mx*2)%2][s[q1]-49][0];
    y+=w[dir][(x1+mx*2)%2][s[q1]-49][1];
    if(s[q1]=='2')dir=(dir+5)%6;else dir=(dir+7)%6;}

  qsort(outer,oc,sizeof(outer[0]),cmp);

  i=o=1;
  for(q1=1;q1<ic;q1++)if(inner[q1].x==inner[q1-1].x&&inner[q1].y==inner[q1-1].y)i=i+0;else i++;
  for(q1=1;q1<oc;q1++)if(outer[q1].x==outer[q1-1].x&&outer[q1].y==outer[q1-1].y)o=o+0;else o++;
  printf("%d %d\n",o,i);
  return 0;}
