P5018 [NOIP2018 普及组] 对称二叉树
P5018 [NOIP2018 普及组] 对称二叉树
题目
思路
通过hash值来判断左右树是否相等
注意,在
常见的孪生质数:
问题
此题为什么不能使用自然溢出解决?
CPP
#include <bits/stdc++.h>
//#define int long long
#define int unsigned long long
const int p1=999999751;
const int p2=100000007;
const int p3=299999827;
const int mod1=89999794200117649;
const int mod2=999999786000011449;
const int N=1e6+10;
using namespace std;
int v[N],node[N];
int Hl[N],hl[N],Hr[N],hr[N];
int n,ans;
struct qwq {
int l,r;
} tree[N];
inline int read() {
int x, f = 1;
char c;
while (!((c = getchar()) >= '0' && c <= '9')) if (c == '-') f = -1;
x = c - '0';
while ((c = getchar()) >= '0' && c <= '9') (x *= 10) += c - '0';
return x * f;
}
inline void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 ^ 48);
}
inline void dfs(int x) {
if(tree[x].l) dfs(tree[x].l);
if(tree[x].r) dfs(tree[x].r);
node[x]=node[tree[x].l]+node[tree[x].r]+1;
if(node[tree[x].l]==node[tree[x].r] && hl[tree[x].l]==hr[tree[x].r] && Hl[tree[x].l]==Hr[tree[x].r])
ans=max(ans,node[x]);
hl[x]=(hl[tree[x].l]*p1+hl[tree[x].r]*p2+v[x]*p3)%mod1;
Hl[x]=(Hl[tree[x].l]*p1+Hl[tree[x].r]*p2+v[x]*p3)%mod2;
hr[x]=(hr[tree[x].l]*p2+hr[tree[x].r]*p1+v[x]*p3)%mod1;
Hr[x]=(Hr[tree[x].l]*p2+Hr[tree[x].r]*p1+v[x]*p3)%mod2;
}
signed main() {
n=read();
for(int i=1; i<=n; i++)
v[i]=read();
for(int i=1; i<=n; i++) {
int l=read(),r=read();
if(l!=-1) tree[i].l=l;
if(r!=-1) tree[i].r=r;
}
dfs(1);
write(ans);putchar('\n');
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】