当年ZJOI这么水呀,随便水一下,结果跪了半个小时。。。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 500010
using namespace std;
char s[maxn];
int f[maxn][3],g[maxn][3];
int n,m,num,id;
void dfs()
{
id++;
if (s[id]=='0')
{
f[id][0]=1;f[id][1]=f[id][2]=0;
g[id][0]=1;g[id][1]=g[id][2]=0;
}
if (s[id]=='1')
{
int x=id;
dfs();
f[x][0]=max(f[x+1][1],f[x+1][2])+1;
f[x][1]=max(f[x+1][0],f[x+1][2]);
f[x][2]=max(f[x+1][0],f[x+1][1]);
g[x][0]=min(g[x+1][1],g[x+1][2])+1;
g[x][1]=min(g[x+1][0],g[x+1][2]);
g[x][2]=min(g[x+1][0],g[x+1][1]);
}
if (s[id]=='2')
{
int x=id,l,r;
l=id+1;
dfs();r=id+1;
dfs();
f[x][0]=max(f[l][1]+f[r][2],f[l][2]+f[r][1])+1;
f[x][1]=max(f[l][0]+f[r][2],f[l][2]+f[r][0]);
f[x][2]=max(f[l][0]+f[r][1],f[l][1]+f[r][0]);
g[x][0]=min(g[l][1]+g[r][2],g[l][2]+g[r][1])+1;
g[x][1]=min(g[l][0]+g[r][2],g[l][2]+g[r][0]);
g[x][2]=min(g[l][0]+g[r][1],g[l][1]+g[r][0]);
}
}
int main()
{
scanf("%s",s+1);
dfs();
printf("%d %d\n",max(f[1][0],max(f[1][1],f[1][2])),min(g[1][0],min(g[1][1],g[1][2])));
return 0;
}