嗯...

题目链接: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 }
AC代码
01-03 12:14