[NOIP2018PJ]对称二叉树
2024-09-03 05:32:26
[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;
}
最新文章
- 东大OJ-一元三次方程解的个数
- jQuery超炫酷按钮插件及源码
- iOS的常见文件及程序的启动原理
- 一套名企WEB前端面试题,不提供答案
- C# WinForm使用Aspose.Cells.dll 导出导入Excel/Doc 完整实例教程
- C++面向对象的编程
- Vbox下linux虚拟机根分区扩容
- iOS 8 自动布局sizeclass和autolayout的基本使用
- cv:显示Linux命令运行进度
- freemarker序列的拆分
- table切换
- 关于sass与VScode 一些配置 学习记录
- node的应用场景
- Exp1 PC平台逆向破解 20165235 祁瑛
- 开源版本PowerShell Core 6.2 发布
- EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE
- struts下载
- Swift 模式匹配
- Image Lazy Load:那些延时加载图片的开源插件(jQuery)
- 《HTTP - 概述》
热门文章
- spring中反射机制和注入的使用
- Lucene3.0详解
- Jenkins spring boot 自动部署方案
- C#--I/O流操作文本文件之StreamWrite类和StreamReader类
- JDBC的常用API
- ORA-1092 : opitsk aborting process---killed by oom killer
- 李洪强经典面试题49-Objective-C
- Could not calculate build plan
- c#的bug?
- iOS开发UITableViewCell的选中时的颜色设置(转)