首页 > 其他分享 >NOI2024 D1T1 - 集合 题解

NOI2024 D1T1 - 集合 题解

时间:2024-10-21 19:44:12浏览次数:1  
标签:int 题解 sum u64 pos NOI2024 哈希 集合 D1T1

观察

我们称 \(x\) 在一段序列中的“位置集合”为 \(x\) 出现的下标的集合。注意到,两段序列能够匹配,当且仅当两段序列的 \(1 \sim m\) 中的数的位置集合构成的多重集相等。快速比较集合,考虑哈希。

哈希

先实现一个从整数到整数的哈希 \(f(x)\)。使用这个哈希的目的是为了提高随机性,防止被卡。

再考虑两个哈希(都使用自然溢出):

  1. \(H(S)\):把位置集合映射为一个整数。其中位置集合指的是数字 \(x\) 在集合序列 \(A\) 或 \(B\) 中出现的的下标的集合。

    用 sum hash 实现: \(H(S)= \sum_{x \in S} f(x)\)。sum hash 的一个好处是,每次加入或删除位置集合中的一个元素,时间复杂度是 \(O(1)\)。这里直接对 \(x\) 求和(应该)也是可行的,但对 \(f(x)\) 求和能够提高随机性。

  2. \(G(T)\):把整数的多重集 \(T\) 映射为一个整数。(这里的多重集指的就是位置集合的哈希值构成的集合。)

    仍然使用 sum hash:\(G(T) = \sum_{x \in T} f(x)\)。为了保险,可以再设计一个平方和的哈希:\(G'(T) = \sum_{x \in T} f^{2}(x)\)。

(1 和 2 实际上可以看作一个哈希:都是集合到整数的映射。)

一个错误示范:

1 和 2 中的两个整数哈希函数 \(f(x)\) 可以是不同的。1 中 \(x\) 的值域为 \(1 \sim n\),我们可以先用 mt19937_64 给 \(1 \sim n\) 中的所有整数赋一个随机的权值,作为 \(f(x)\)。2 中 \(x\) 的值域太大,不能预处理,可以用 xor shift 实现哈希:

u64 Hash(u64 x)
{
    x ^= mask, x ^= x << 13, x ^= x >> 7, x ^= mask;
    return x;
}

其中 mask 是一个随机的常数,而左移右移的位数和次数是随便选的。

注:集合的哈希函数用 xor sum 似乎错误率更高,不知道为什么,参见这个提交

好吧我知道为什么了,我怎么这么蠢

标签:int,题解,sum,u64,pos,NOI2024,哈希,集合,D1T1
From: https://www.cnblogs.com/dengstar/p/18490128

相关文章

  • 题解 P11220 / MX241020D【【MX-S4-T4】「yyOI R2」youyou 的三进制数】
    好长的标题题目描述现在有\(0\simn\)共\(n+1\)个数。定义\((x)_{3}\)表示十进制数\(x\)的三进制形式。如果没有特别强调,那么这些数均为十进制形式。youyou想构造一个序列长度为\(p\)(\(p\ge1\))的非负整数序列\(a\)。使之满足:\(a_i\in[0,n]\)。不存在\(i......
  • P9890 [ICPC2018 Qingdao R] Tournament 题解
    P9890[ICPC2018QingdaoR]Tournament题目传送门更好的阅读体验一道找规律的思维题。前置知识\(lowbit\)\(lowbit\)是指获取一个二进制数中最右边的\(1\)所对应的数值。具体地,\(lowbit\)可以通过对一个数取反然后加\(1\),再与原数进行按位与的方式来实现。intlow......
  • ZZJC新生训练赛第六场题解
    先给出比赛链接:下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):BHMedium(中等):DEHard(困难):AGAnti-AK(防AK):CFA扣分扣分扣分!扣分!二维前缀差分板子题题目要求对二维区间加某个数或者查询二维区间的和与一维前缀和类似地,我们定义$sa[i][j]$为区间(......
  • 「题解」Codeforces Round 980 (Div. 2)
    before\(A\simD\)的题解A.ProfitableInterestRateProblemA.ProfitableInterestRateSol&Code数学题,有\(a-x\geqb-2x\),得\(x=b-a\)。特判\(a\geqb\)以及\(a<x\)的情况即可。#include<bits/stdc++.h>#defineM10001#defineN......
  • 双系统Linux使用windows硬盘导致git报错问题解决
    一.问题产生的背景双系统下ubuntu为了节省空间挂载使用了windows硬盘,在使用最新的gitclone代码后提示“gitfataldetecteddubiousownershipinrepository”,这是git为了安全原因限制登陆用户和仓库文件用户必须一致,否则提示上述错误信息二.问题的解决办法办法1:挂载磁盘时......
  • 「题解」Codeforces Round 979 (Div. 2)
    before\(A\simD\)的题解A.AGiftFromOrangutanProblemA.AGiftFromOrangutanSol&Code\(c_i-b_i\)最大就是\(a\)的最大值减最小值。将\(a\)的最大值\(x\)和最小值\(y\)放到头两位即可得到答案\((x-y)(n-1)\)。#include<bits/stdc++.h>#defineM......
  • AT_abc348_d [ABC348D] Medicines on Grid 题解
    题目传送门题目大意:给定一个\(n\timesm\)的地图,要求从起点S走到终点T,每移动\(1\)个会消耗\(1\)点能量,障碍#不能走,空地为.可以走,体力消耗至\(0\)也无法移动,地图位置\((x_i,y_i)\)有一瓶可以变成\(e_i\)体力的药,可以选择是否喝。问能否抵达终点,可以输出Yes,否......
  • AT_abc374_e [ABC374E] Sensor Optimization Dilemma 2 题解
    洛谷题目传送门AT题目传送门题目大意:给定\(n\)道工序,你有\(X\)元的资金,对于第\(i\)道工序,有两种机器供你选择,第一种机器可以花费\(P_i\)元处理\(A_i\)个产品,第二种机器可以花费\(Q_i\)元处理\(B_i\)个产品。钦定第\(i\)天处理的产品个数为\(W_i\),求在总花费......
  • UVA11294 Wedding 题解
    洛谷题目传送门前排提示:本题需要用到知识点2-SAT以及强联通分量,模板传送门P4782【模板】2-SAT。题目大意:有至多\(30\)对夫妻将会参加一个婚宴。他们将会坐在一个长桌子的两边。新郎新娘坐在彼此相对的一端并且新娘带着一个头饰使得她看不到和她坐在同一边的人。夫妻坐在......
  • SP9685 ZTC - Zombie’s Treasure Chest 题解
    洛谷题目传送门双倍经验简单题。对于空间大小为\(s1\timess2\)时,显然最多可得到的价值为\(\max(s2\timesv1,s1\timesv2)\),剩下小于\(s1\timess2\)的部分选一个占用空间大的枚举就好。时间复杂度:\(O(T\lfloor\frac{m}{\max(s1,s2)}\rfloor)\),其中\(m=n\bmo......