树哈希

#include<bits/stdc++.h>
#define ull unsigned long long
#define ins insert
using namespace std;
constexpr int maxn=1e7+10;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || ch>'9')
    {
        if (ch == '-') f=-1;
        ch=getchar();
    }
    while (ch>='0' && ch<='9')
    {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n;
set<ull> s;
int h[maxn],to[maxn],nxt[maxn],tot;
void add(int x,int y) {tot++,to[tot]=y,nxt[tot]=h[x],h[x]=tot;}
ull hs[maxn],rd1,rd2;
ull rd(ull x)
{
    x^=rd2;
    x^=(x>>11);
    x^=(x<<4);
    x^=(x>>5);
    x^=(x<<14);
    return x+91919810;
}
void dfs(int x,int fa)
{
    hs[x]=0;
    for (int i=h[x];i;i=nxt[i])
    {
        int y=to[i];
        if (y == fa) continue;
        dfs(y,x);
        hs[x]+=rd(hs[y]);
    }
    hs[x]+=rd1;
    s.ins(hs[x]);
}
signed main()
{
    srand(time(0));
	n=read();
    rd1=1ll*rand()*rand()%1145141919+1,rd2=1ll*rand()*rand()%1145141919+1;
    for (int i=1;i<n;i++)
    {
        int x=read(),y=read();
        add(x,y),add(y,x);
    }
    dfs(1,1);
    printf("%d\n",(int)s.size());
    return 0;
}
posted @ 2026-07-27 16:14  msjing  阅读(5)  评论(0)    收藏  举报