rt
辛苦大佬们了
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
string s;
int cnt,f[N][3],g[N][3];
void dfs(int x)
{
if(s[x]=='0') f[x][0]=g[x][0]=1;
dfs(++cnt);
if(s[x]=='1')
{
cnt++;
dfs(cnt);
f[x][0]=min(f[cnt][1],f[cnt][2])+1;
f[x][1]=min(f[cnt][0],f[cnt][2]);
f[x][2]=min(f[cnt][0],f[cnt][1]);
g[x][0]=min(g[cnt][1],g[cnt][2])+1;
g[x][1]=min(g[cnt][0],g[cnt][2]);
g[x][2]=min(g[cnt][0],g[cnt][1]);
}
else if(s[x]=='2')
{
cnt++;
int k=++cnt;
dfs(k);
f[x][0]+=min(f[x+1][1]+f[k][2],f[x+1][2]+f[k][1])+1;
f[x][1]+=min(f[x+1][0]+f[k][2],f[x+1][2]+f[k][0]);
f[x][2]+=min(f[x+1][0]+f[k][0],f[x+1][1]+f[k][0]);
g[x][0]+=max(g[x+1][1]+g[k][2],g[x+1][2]+g[k][1])+1;
g[x][1]+=max(g[x+1][0]+g[k][2],g[x+1][2]+g[k][0]);
g[x][2]+=max(g[x+1][0]+g[k][0],g[x+1][1]+g[k][0]);
}
return;
}
int main( )
{
cin>>s;
dfs(cnt);
cout<<max(g[0][0],max(g[0][1],g[0][2]))<<" "<<min(f[0][0],min(f[0][1],f[0][2]));
return 0;
}