关于哈希冲突
查看原帖
关于哈希冲突
766573
chenbs楼主2024/5/22 17:31

用哈希表判断对称二叉树,结果 WA 了 3 个点。加了多重哈希也没有用,是不是写的不好

#include<bits/stdc++.h>
// 一些随便找的质数
#define p1 167772161ull
#define p2 469762049ull
#define p3 754974721ull
#define p4 998244353ull
#define p5 1004535809ull
#define p6 1222827239ull
#define p7 1610612741ull
#define p8 3221225473ull
#define p9 4294967291ull
using namespace std;
typedef unsigned long long ull;
int n,v[1000005],l[1000005],r[1000005],size[1000005];
ull h[1000005],hinv[1000005];
ull h2[1000005],h2inv[1000005];
ull h3[1000005],h3inv[1000005];
int read() {
	char c=getchar();
	int n=0,f=1;
	while(c<48) {
		if(c == '-') f=-1;
		c=getchar();
	}
	while(c>47) n=n*10+(c^48), c=getchar();
	return n*f;
}
void dfs(int rt) {
	size[rt]=1;
	h[rt]=hinv[rt]=v[rt]*p3;
	h2[rt]=h2inv[rt]=v[rt]*p6;
	h3[rt]=h3inv[rt]=v[rt]*p9;
	if(~l[rt]) {
		dfs(l[rt]);
		size[rt]+=size[l[rt]];
		h[rt]+=h[l[rt]]*p1;
		hinv[rt]+=hinv[l[rt]]*p2;
		h2[rt]+=h2[l[rt]]*p4;
		h2inv[rt]+=h2inv[l[rt]]*p5;
		h3[rt]+=h3[l[rt]]*p7;
		h3inv[rt]+=h3inv[l[rt]]*p8;
	}
	if(~r[rt]) {
		dfs(r[rt]);
		size[rt]+=size[r[rt]];
		h[rt]+=h[r[rt]]*p2;
		hinv[rt]+=hinv[r[rt]]*p1;
		h2[rt]+=h2[r[rt]]*p5;
		h2inv[rt]+=h2inv[r[rt]]*p4;
		h3[rt]+=h3[r[rt]]*p8;
		h3inv[rt]+=h3inv[r[rt]]*p7;
	}
}
int main() {
	n=read();
	for(int i=1; i<=n; i++) v[i]=read();
	for(int i=1; i<=n; i++) l[i]=read(), r[i]=read();
	dfs(1);
	int ans=1;
	for(int i=1; i<=n; i++)
		if(h[l[i]] == hinv[r[i]] && h2[l[i]] == h2inv[r[i]] && h3[l[i]] == h3inv[r[i]])
			ans = max(ans,size[i]);
	cout<<ans;
}
2024/5/22 17:31
加载中...