UOJ Logo Universal Online Judge

UOJ

#763. 树哈希

附件下载 统计

这是一道模板题。

给定一棵以点 $1$ 为根的树,你需要输出这棵树中最多能选出多少个互不同构的子树。

两棵有根树 $T_1$、$T_2$ 同构当且仅当他们的大小相等,且存在一个顶点排列 $\sigma$ 使得在 $T_1$ 中 $i$ 是 $j$ 的祖先当且仅当在 $T_2$ 中 $\sigma(i)$ 是 $\sigma(j)$ 的祖先。

输入格式

第一行一个正整数 $n$,表示树的点数。

接下来 $n-1$ 行给出树边。每行两个正整数 $a,b$,表示树上有一条连接点 $a$ 和点 $b$ 的边。

输出格式

一行一个正整数,表示最多能选出的互不同构的子树个数。

样例一

input

10
1 2
1 3
2 4
2 5
3 6
3 7
3 8
8 9
8 10

output

4

explanation

一种最优的选法是选择 $1$ 号点、$2$ 号点、$3$ 号点、$4$ 号点的子树。

限制与约定

对于所有数据,$1 \le n \le 10^6$。

提示:由于 Hack 机制的存在,不建议使用固定的哈希模数。C++11 中一种安全的随机数生成器为 mt19937_64(chrono::steady_clock::now().time_since_epoch().count())

时间限制:$5\texttt{s}$

空间限制:$512\texttt{MB}$