树哈希

ull shift(ull x){
	x^=sui,x^=x<<13,x^=x>>7,x^=x<<17,x^=sui;
	return x;
}
void dfs1(int x,int fa){//算哈希值
	hs[x]=1;
	for(int i=h[x];i;i=d[i].n){
		int y=d[i].b;
		if(y==fa) continue; 
		dfs1(y,x);
		hs[x]+=shift(hs[y]);
	}
	add(hs[x]);
}
void dfs2(int x){//换根
	hsh+=shift(hs[x]);
	for(int i=h[x];i;i=d[i].n){
		int y=d[i].b;
		ull hsx=hs[x],hsy=hs[y];
		hs[x]-=shift(hs[y]),hs[y]+=shift(hs[x]);
		dfs2(y);
		hs[x]=hsx,hs[y]=hsy;
	}
}
posted @ 2023-12-20 11:35  hubingshan  阅读(32)  评论(0)    收藏  举报