首页 > 其他分享 >树哈希

树哈希

时间:2023-03-04 20:15:43浏览次数:46  
标签:hash 哈希 int edge ull getHash include

模板

#include <cctype>
#include <chrono>
#include <cstdio>
#include <random>
#include <set>
#include <vector>
typedef unsigned long long ull;
const ull mask = std::chrono::steady_clock::now().time_since_epoch().count();
ull shift (ull x) {
    x ^= mask;
    x ^= x << 13;
    x ^= x >> 7;
    x ^= x << 17;
    x ^= mask;
    return x;
}
const int N = 1e6 + 10;
int n;
ull hash[N];
std::vector<int> edge[N];
std::set<ull> trees;
void getHash(int x, int p) {
    hash[x] = 1;
    for (int i : edge[x]) {
        if (i == p) {
            continue;
        }
        getHash(i, x);
        hash[x] += shift(hash[i]);
    }
    trees.insert(hash[x]);
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i < n; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    getHash(1, 0);
    printf("%lu", trees.size());
}

标签:hash,哈希,int,edge,ull,getHash,include
From: https://www.cnblogs.com/duoluoluo/p/17178963.html

相关文章