然而我觉得要加一个树Hash判断形状吧
by bellmanford @ 2019-11-13 08:38:05
我看了一下,形状的话我是先dfs一下这颗树得到每个点的左孩子数和右孩子数,要是左右孩子数不相等要把半径设成0;
```cpp
for(int i=1;i<=tot;i++){
if(i<maxright){
hw[i]=min(hw[(mid<<1)-i],hw[mid]+mid-i);
if(tr[tr[pre[i]].ls].size==tr[tr[pre[i]].rs].size&&hw[i]*2+1>=tr[pre[i]].size) ans=max(ans,tr[pre[i]].size);
}
else hw[i]=0;
while(a[i+hw[i]+1]==a[i-hw[i]-1]){
++hw[i];
if(tr[tr[pre[i]].ls].size==tr[tr[pre[i]].rs].size&&hw[i]*2+1>=tr[pre[i]].size) ans=max(ans,tr[pre[i]].size);
}//到这里我都和你差不多,回文加速的部分不用改
if(hw[i]+i>maxright){
maxright=hw[i]+i;
mid=i;
}
//但是我这里加了个特判要是左孩子数和右孩子数不相等或者hw[i]的大小比左孩子个数少
//那么这个树不是对称的,hw[i]应该修改成0
// if(a[i].lsoncount!=a[i].rsoncount||hw[i]<a[i].lsoncount)
// hw[i]=0;
//像这样
}
```
by Schwarzkopf_Henkal @ 2019-11-13 08:48:16
@[bellmanford](/user/116015)
要是左孩子数和右孩子树相等,每个节点的层次和值都呈现回文,那么这个树一定是回文的
by Schwarzkopf_Henkal @ 2019-11-13 08:49:28
啊是对称
by Schwarzkopf_Henkal @ 2019-11-13 08:49:43
还有@[初音美如画](/user/207667)
你说谁逼呢我现在坐在你对面还有你被JC签名被改了都不知道
by Schwarzkopf_Henkal @ 2019-11-13 08:51:28
@[Schwarzkopf_Henkal](/user/251723) 谢谢
by bellmanford @ 2019-11-13 09:07:32
@[bellmanford](/user/116015) qwq
by Schwarzkopf_Henkal @ 2019-11-13 09:09:53
@[Schwarzkopf_Henkal](/user/251723) [HELP](https://www.luogu.org/discuss/show/167539)
by bellmanford @ 2019-11-13 09:11:57