[NOIP2018PJ]对称二叉树

这个题正常人看到题面难道不是哈希?

乱写了个树哈希...

#include<bits/stdc++.h>
using namespace std;
const int _=1e6+5,p=998244353;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n,ans=1,w[_],ls[_],rs[_],sz[_],f[_],g[_],h[_];
void init(int u){
sz[u]=1;
if(ls[u]>0){init(ls[u]);sz[u]+=sz[ls[u]];h[u]++;}
if(rs[u]>0){init(rs[u]);sz[u]+=sz[rs[u]];h[u]++;}
}
void calc(int u){
f[u]=w[u]*233+sz[u]*(19+h[u]);
if(ls[u]>0){
calc(ls[u]);
f[u]=1ll*f[u]*17%p+f[ls[u]]%p;
}
if(rs[u]>0){
calc(rs[u]);
f[u]=1ll*f[u]*f[u]%p+f[rs[u]]%p;
}
}
void dfs(int u){
if(ls[u]>0)dfs(ls[u]);
if(rs[u]>0)dfs(rs[u]);
swap(ls[u],rs[u]);
}
int main(){
n=re();
for(int i=1;i<=n;i++)w[i]=re();
for(int i=1;i<=n;i++)
ls[i]=re(),rs[i]=re();
init(1);calc(1);
for(int i=1;i<=n;i++)g[i]=f[i];
dfs(1);calc(1);
for(int i=1;i<=n;i++)
if(f[i]==g[i])ans=max(ans,sz[i]);
printf("%d\n",ans);
return 0;
}

最新文章

  1. 东大OJ-一元三次方程解的个数
  2. jQuery超炫酷按钮插件及源码
  3. iOS的常见文件及程序的启动原理
  4. 一套名企WEB前端面试题,不提供答案
  5. C# WinForm使用Aspose.Cells.dll 导出导入Excel/Doc 完整实例教程
  6. C++面向对象的编程
  7. Vbox下linux虚拟机根分区扩容
  8. iOS 8 自动布局sizeclass和autolayout的基本使用
  9. cv:显示Linux命令运行进度
  10. freemarker序列的拆分
  11. table切换
  12. 关于sass与VScode 一些配置 学习记录
  13. node的应用场景
  14. Exp1 PC平台逆向破解 20165235 祁瑛
  15. 开源版本PowerShell Core 6.2 发布
  16. EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE
  17. struts下载
  18. Swift 模式匹配
  19. Image Lazy Load:那些延时加载图片的开源插件(jQuery)
  20. 《HTTP - 概述》

热门文章

  1. spring中反射机制和注入的使用
  2. Lucene3.0详解
  3. Jenkins spring boot 自动部署方案
  4. C#--I/O流操作文本文件之StreamWrite类和StreamReader类
  5. JDBC的常用API
  6. ORA-1092 : opitsk aborting process---killed by oom killer
  7. 李洪强经典面试题49-Objective-C
  8. Could not calculate build plan
  9. c#的bug?
  10. iOS开发UITableViewCell的选中时的颜色设置(转)