题意:
分析:
很有毒的树形DP题
每个串联和并联都可以看作:新加一个点,将串(并)联的两个点作为新点的儿子。
然后,可以记录4种状态进行树形DP
转移分串并联讨论一下就可以了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 1000010
#define INF 0x3FFFFFFF
using namespace std;
char s[MAXN];
int tot;
struct node{
int typ;
node *ch[2];
int dp[5];
int f1,f2,siz;
}Pool[MAXN];
node *ncnt=Pool,*rt=Pool;
char* build_tree(node *&x,char *s){
x=++ncnt;
if(*s=='P'){
s++;
x->typ=1;
x->f1=('o'!=*s++);
s++;
s=build_tree(x->ch[0],s);
s=build_tree(x->ch[1],s);
s++;
x->f2=('o'!=*s++);
s++;
x->siz=x->f1+x->f2;
}
else if(*s=='S'){
s++;
x->typ=2;
s=build_tree(x->ch[0],s);
s=build_tree(x->ch[1],s);
s++;
}
else if(*s=='o'){
s++;
x->