首页 > 其他分享 >树哈希

树哈希

时间:2022-10-23 15:33:43浏览次数:36  
标签:RAND f2 f1 int siz MAXN 哈希

乱搞。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000006;
const __uint128_t P = 0xffffffff00000001;
int n;
const __uint128_t B = 19260817;
__uint128_t BASE[MAXN];
__uint128_t RAND[MAXN][4];
struct Graph {
#define forGraph(u, v) for (int i = fst[u], v = to[i]; i; i = nxt[i], v = to[i])
    int fst[MAXN], nxt[MAXN << 1], to[MAXN << 1], tot;
    int siz[MAXN];
    __uint128_t f1[MAXN], f2[MAXN];
    void add(int u, int v) {
        to[++tot] = v, nxt[tot] = fst[u], fst[u] = tot;
    }
    void dfs(int u, int pre) {
        vector<int> q;
        siz[u] = 1;
        forGraph(u, v) if (v != pre) {
            dfs(v, u);
            q.push_back(v);
            siz[u] += siz[v];
        }
        sort(begin(q), end(q), [&](int a, int b) { return f1[a] < f1[b]; });
        f1[u] = RAND[siz[u]][0];
        f2[u] = RAND[siz[u]][2];
        for (auto v : q) {
            f1[u] = (1ll * f1[u] * BASE[siz[v]] + f2[v]) % P;
            f2[u] = ((1ll * f2[u] * BASE[siz[v]]) ^ f1[v]) % P;
			// 《交叉哈希》
        }
        f1[u] = (1ll * f1[u] * B + RAND[siz[u]][1]) % P;
        f2[u] = (1ll * f2[u] * B + RAND[siz[u]][3]) % P;
    }
} g;
int main() {
    BASE[0] = 1;
    mt19937_64 Rand(chrono::steady_clock::now().time_since_epoch().count());
    for (int i = 1; i < MAXN; i++) BASE[i] = 1ll * BASE[i - 1] * B % P;
    for (int j = 0; j < 4; j++) {
        for (int i = 1; i < MAXN; i++) RAND[i][j] = Rand() % P;
    }
    scanf("%d", &n);
    for (int i = 1; i < n; i++) {
        int a, b; scanf("%d%d", &a, &b);
        g.add(a, b), g.add(b, a);
    }
    g.dfs(1, 0);
    set<pair<__uint128_t, __uint128_t>> s;
    for (int i = 1; i <= n; i++) s.insert({ g.f1[i], g.f2[i] });
    printf("%lu\n", s.size());
    return 0;
}

有没有大佬能把这个卡掉啊

标签:RAND,f2,f1,int,siz,MAXN,哈希
From: https://www.cnblogs.com/apjifengc/p/16818660.html

相关文章

  • MD5 哈希加密算法 - C++ 实现
    MD5加密算法-C++实现写在前头:还在学习中!整个文档写的很匆忙,肯定还有很多不周到的地方.欢迎在评论中提出你的宝贵意见!!算法背景BackgroundMD5消息摘要算法......
  • 【leetcode_C++_哈希表_day5】242. 有效的字母异位词&&349. 两个数组的交集&&202.快乐
    C++知识补充:(不完全,仅针对本题用的知识点)1.C++类&对象关键字public确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成......
  • 数据结构与算法系列二之链表、哈希表及栈
    第四章链表21、删除倒数第k个节点题目:如果给定一个链表,请问如何删除链表中的倒数第k个节点?假设链表中节点的总数为n,那么1≤k≤n。要求只能遍历链表一次。例如,输入下图1......
  • 补题记录——Oct. Training 1-图论、集合哈希
    H-BoboniuWalksonGraphhttps://codeforces.com/problemset/problem/1394/B题意给n个点m条有向边,么个点的出度不超过k(k<=9),每条边都有一个边权在(\(1<=w<=m\))且每条边......
  • 可哈希与不可哈希?
    python中可哈希的数据类型,即不可变的数据结构(数值类型(int,float,bool)字符串str、元组tuple、自定义类的对象)。不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集......
  • 树哈希& 最小表示法
    1.把深度和子树大小全部考虑到的树哈希,LLhashx(intx,intfa,intdep){if(sz[x]==1)return1;vector<LL>vs;LLans=h[dep]%mod;for(int......
  • 局部敏感哈希(Locality Sensitive Hashing)和MinHash介绍与实例
    在实际应用中,我们所面对的数据是海量的,并且有着很高的维度。在对数据的各种操作中,查询操作是最常见的一种,这里的查询是指输入一个数据,查找与其相似的数据,那么怎样快速地......
  • set接口和HashSet集合和哈希值
    set接口set接口和List接口一样同样继承自Collection接口它与Collection接口中的方法基本一致并没有对Collection接口进行功能上的补充只是比Collection接口更加严格了......
  • 线段树维护哈希
    显然两个区间的哈希值是可以合并的,所以线段树可以维护区间的哈希值。设左儿子的长度和哈希值分别为\(sz_a,h_a\),右儿子的长度和哈希值分别为\(sz_b,h_b\),合并后的长度为......
  • Redis数据结构之哈希
    目录Redis数据结构之哈希写入获取数据修改数据删除数据删除所有数据查看key中指定的field是否存在若value中没有相应的field,则创建获取多个值获取所有的key和value获取所......