嗯...
题目链接:https://www.luogu.org/problem/P5018
其实这道题直接搜索就可以搜满分:
首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点的那棵子树是不是对称的,然后在对称的子树中记录最大值。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 struct node{ 7 int l, r, v, len; 8 node() {l = -1; r = -1;} 9 } e[1000005]; 10 11 int n, ans; 12 13 inline int dfs(int k){ 14 e[k].len = 1; 15 if(e[k].l != -1) e[k].len += dfs(e[k].l); 16 if(e[k].r != -1) e[k].len += dfs(e[k].r); 17 return e[k].len; 18 }//初始化子树大小 19 20 inline bool check(int ls, int rs){ 21 bool p = 1; 22 if(e[ls].v != e[rs].v) return false; 23 if((e[ls].l != -1 && e[rs].r == -1) || (e[ls].l == -1 && e[rs].r != -1) || (e[ls].r != -1 && e[rs].l == -1) || (e[ls].r == -1 && e[rs].l != -1)) return false; 24 if(e[ls].l != -1 && e[rs].r != -1) p = p & check(e[ls].l, e[rs].r); 25 if(e[ls].r != -1 && e[rs].l != -1) p = p & check(e[ls].r, e[rs].l); 26 return p; 27 }//判断是否对称 28 29 int main(){ 30 scanf("%d", &n); 31 for(int i = 1; i <= n; i++) scanf("%d", &e[i].v); 32 for(int i = 1; i <= n; i++) scanf("%d%d", &e[i].l, &e[i].r); 33 dfs(1); 34 for(int i = 1; i <= n; i++) 35 if(check(e[i].l, e[i].r)) ans = max(ans, e[i].len); 36 printf("%d\n", ans); 37 return 0; 38 }