树哈希
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;
}
}

浙公网安备 33010602011771号