按照大佬提示数组已开大,一片wa
#include <bits/stdc++.h>
using namespace std;
char a[1000005];
int f[1000005][3],ff[1000005][3],p,t=1;
struct tr{
int l;
int r;
int fa=0;
}b[1000005];
queue <char> q;
int dp0(int x);
int dp1(int x);
int dp2(int x);
int ddp0(int x);
int ddp1(int x);
int ddp2(int x);
void bt()//建树
{
if(q.front()=='0')
{
b[t].l=0;b[t].r=0;//此处没有操作
}
if(q.front()=='1')
{
int x=t;
b[t].r=0;
b[t].l=++t;
b[t].fa=x;
q.pop();
bt();
}
if(q.front()=='2')
{
int x=t;
b[x].l=++t;
b[t].fa=x;
q.pop();
bt();
b[x].r=++t;
b[t].fa=x;
q.pop();
bt();
}
}
int dp0(int x)
{
if(f[x][0]!=-1)return f[x][0];
if(x==0)
{
f[x][0]=0;
return f[x][0];
}
f[x][0]=0;
f[x][0]+=max(dp1(b[x].l)+dp2(b[x].r),dp2(b[x].l)+dp1(b[x].r));
f[x][0]++;
return f[x][0];
}
int dp1(int x)
{
if(f[x][1]!=-1)return f[x][1];
if(x==0)
{
f[x][1]=0;
return f[x][1];
}
f[x][1]=0;
f[x][1]+=max(dp0(b[x].l)+dp2(b[x].r),dp2(b[x].l)+dp0(b[x].r));
return f[x][1];
}
int dp2(int x)
{
if(f[x][2]!=-1)return f[x][2];
if(x==0)
{
f[x][2]=0;
return f[x][2];
}
f[x][2]=0;
f[x][2]+=max(dp0(b[x].l)+dp1(b[x].r),dp1(b[x].l)+dp0(b[x].r));
return f[x][2];
}
int ddp0(int x)
{
if(ff[x][0]!=-1)return ff[x][0];
if(x==0)
{
ff[x][0]=0;
return ff[x][0];
}
ff[x][0]=0;
ff[x][0]+=min(ddp1(b[x].l)+ddp2(b[x].r),ddp2(b[x].l)+ddp1(b[x].r));
ff[x][0]++;
return ff[x][0];
}
int ddp1(int x)
{
if(ff[x][1]!=-1)return ff[x][1];
if(x==0)
{
ff[x][1]=0;
return ff[x][1];
}
ff[x][1]=0;
ff[x][1]+=min(ddp0(b[x].l)+ddp2(b[x].r),ddp2(b[x].l)+ddp0(b[x].r));
return ff[x][1];
}
int ddp2(int x)
{
if(ff[x][2]!=-1)return ff[x][2];
if(x==0)
{
ff[x][2]=0;
return ff[x][2];
}
ff[x][2]=0;
ff[x][2]+=min(ddp0(b[x].l)+ddp1(b[x].r),ddp1(b[x].l)+ddp0(b[x].r));
return ff[x][2];
}
int main()
{
char c;
while(scanf("%c",&c)!=EOF)
a[++p]=c;
p--;
for(int i=1;i<=p;i++)
q.push(a[i]);
bt();
memset(f,-1,sizeof(f));
memset(ff,-1,sizeof(ff));
cout<<max(max(dp0(1),dp1(1)),dp2(1))<<" ";
cout<<min(min(ddp0(1),ddp1(1)),ddp2(1));
return 0;
}