迷一样的hash.....
题目链接
2016 JAG E Similarity of Subtrees
分析
啊这位大佬的图非常到位
hash函数的定义方式是将深度为
d
的顶点给一个权重
AC code
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define PI acos(-1)
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define INF64 0x3f3f3f3f3f3f3f3f
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define ms(x,v) memset((x),(v),sizeof(x))
#define eps 1e-8
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef long double DB;
typedef pair<int,int> Pair;
const int maxn = 1e5+10;
const int MOD = 1e9+7;
const int p = 19;
std::map<LL, int> ma;
LL hash_val[maxn];
std::vector<int> G[maxn];
void dfs(int u,int fa) {
hash_val[u] =1;
for(auto v: G[u]){
if(v == fa)continue;
dfs(v,u);
hash_val[u] = (hash_val[u]+hash_val[v]*p) % MOD;
}
ma[hash_val[u]]++;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=0 ; i<n-1 ; ++i){
int u,v;
cin>>u>>v;
G[u].pb(v);G[v].pb(u);
}
dfs(1,-1);
LL ans =0;
for(auto e : ma){
ans += (LL)e.se*(e.se -1)/2;
}
std::cout << ans << '\n';
return 0;
}