异或哈希
1|0理论基础
异或哈希是个很神奇的算法,利用了异或操作的特殊性和哈希降低冲突的原理,可以用于快速找到一个组合是否出现、序列中的数是否出现了k次
https://blog.csdn.net/notonlysuccess/article/details/130959107
https://codeforces.com/blog/entry/85900
2|0CF1175F
https://codeforces.com/contest/1175/problem/F
那么,最经典的求组合出现问题
理论基础中提到了这个问题,并给出了
根据问题进一步提取性质:
- 满足条件的区间肯定有
和 等于区间长度的最大值 - 分类
在 的左边或者右边处理即可。
3|0CF1418G
https://www.luogu.com.cn/problem/CF1418G
那么,出现次数问题
这里要求出现三次,所以不用二进制异或而是新定义一个三进制异或:
首先我们知道一个思想,证明充要条件就要证明它既充分又必要;同样,要证明一个数等于某个值,必须让它既小于等于又大于等于这个值。
这个思想运用到这道题上就十分方便。我们让所有数的出现个数
第一个约束十分好想,可以规约到
然后考虑第二个约束。我们考虑使用类似于双指针的算法,具体来说:考虑对于一个满足约束二的
令
4|0CF1996G
很神奇的哈希做法
我们设
对于每对朋友,要么是通过优弧联通,要么是通过劣弧联通,所以我们干脆直接对优弧劣弧都染色一下
其中绿色/橙色是
要维护最少的路,就是通过我们对于每队朋友都选择他们的劣弧/优弧后使得没有被染色的道路最多(我们选择某队朋友的劣弧后,就使得优弧不存在图上了)
一个很经典的思路:保留最少相当于删除最多
为了方便写博客,我们分别对上面颜色的曲线进行编号:绿色是1,黄色是2,橙色是3,蓝色是4
那么我们能选择的弧的集合其实是
其实就是我们要对每对朋友都选择一个弧,使得仅被这些弧染色的道路尽可能多,然后删除这些道路
我们改怎么实现这个想法呢?
我们定义
我们对每对朋友的两个端点都
然后我们维护一个前缀和就可以得到
而这是非常抽象的,我们是怎么得到染色情况的呢?并且我们不是只染了一个弧吗,另一个难道直接不管了?
首先我们先简化模型,假设只有
然后又加上了
可以发现神奇的每个数值刚好都对应着一种弧的集和
我们对两端都异或同一个随机数是通过差分的思想来
可以通过前缀和得知染色情况是因为,我们通过六十四位的随机数异或值实现了哈希的思想,对于每种弧都有特定的哈希值,而弧集的哈希值是可以通过异或得到,这个比较抽象,所以建议可以理解为状压差不多的思想
还有一个问题:为什么只对一个弧染色就相当于对两个弧都染色了呢
因为是异或的随机值,我们对优弧染上了
然后用统计下前缀和出现最多的数值,删除这个数就是答案
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/18333737.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示