RT,空间已开大仍RE,求助;w;
#include<cstdio>
#include<cstring>
#define fmin cyxakioi1
#define fmax cyxakioi2
using namespace std;
const int N = 1000020;
inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
int num,c,f=1;
for(;!isd(c=getchar());f=c);
for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
return f^45?num:-num;
}
int n,dfn;
char s[N];
int fmax[N][5], fmin[N][5];
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
void dfs(int x){
if(x>n) return;//不加RE,加WA
if(s[x]=='0'){
fmin[x][0] = fmax[x][0] = 1;
return;
}
// printf("%d\n",dfn);
fmin[x][0] = fmin[x][1] = fmin[x][2] = 1e9;
int lson = ++dfn;
dfs(dfn);
if(s[x]=='1'){
fmax[x][0] = max(fmax[lson][1],fmax[lson][2]) + 1;
fmax[x][1] = max(fmax[lson][0],fmax[lson][2]);
fmax[x][2] = max(fmax[lson][0],fmax[lson][1]);
fmin[x][0] = min(fmin[lson][1],fmin[lson][2]) + 1;
fmin[x][1] = min(fmin[lson][2],fmin[lson][0]);
fmin[x][2] = min(fmin[lson][0],fmin[lson][1]);
}
else{
int rson = ++dfn;
dfs(dfn);
fmax[x][0] = max(fmax[lson][1] + fmax[rson][2], fmax[lson][2] + fmax[rson][1]) + 1;
fmax[x][1] = max(fmax[lson][0] + fmax[rson][2],fmax[lson][2] + fmax[rson][0]);
fmax[x][2] = max(fmax[lson][1] + fmax[rson][0],fmax[lson][0] + fmax[rson][1]);
fmin[x][0] = min(fmin[lson][1] + fmin[rson][2], fmin[lson][2] + fmin[rson][1]) + 1;
fmin[x][1] = min(fmin[lson][0] + fmin[rson][2], fmin[lson][2] + fmin[rson][0]);
fmin[x][2] = min(fmin[lson][1] + fmin[rson][0], fmin[lson][0] + fmin[rson][1]);
}
}
int main(){
scanf("%s",s+1); n = strlen(s+1);
dfs(1);
printf("%d %d\n",fmax[1][0], min(fmin[1][0], min(fmin[1][1],fmin[1][2])));
return 0;
}