Hash(哈希)选做

洛谷 P3501 [POI2010]ANT-Antisymmetry

由题意得,“反对称”字符串长度一定为偶数。

原串正着 Hash,取反后的串倒着 Hash,然后枚举中间点,二分长度。

洛谷 P2852 [USACO06DEC]Milk Patterns G

显然答案具有单调性,二分最大长度,Hash + 排序 O(nlog⁡n)O(n \log n)O(nlogn) 算出现次数。

时间复杂度 O(nlog⁡2n)O(n \log^2 n)O(nlog2n)

洛谷 P2757 [国家集训队]等差子序列

Len≥3Len\geq3Len3,所以只需找到 Len=3Len=3Len=3 的等差子序列即可。枚举中项,对于每一个 AiA_iAi 判断是否存在 Ai+kA_i+kAi+kAi−kA_i-kAikAiA_iAi 的异侧。

建立一个长为 NNN 的序列 XXX,初始全为 000,从左到右扫一遍 {Ai}\{A_i\}{Ai},每次将 XAiX_{A_i}XAi 设为 111,那么如果不存在 Ai+kA_i+kAi+kAi−kA_i-kAikAiA_iAi 的异侧,意味着所有的 Ai+kA_i+kAi+kAi−kA_i-kAik 已经被加入到 XXX 中,那么此时以 XAiX_{A_i}XAi 为中点,两端不超过边界的 XXX 的子串(必定是前缀或后缀)一定为回文串。

回文串可以使用 Hash 判断,因为 Hash 也算序列问题,所以考虑用线段树维护序列 XXX 的 Hash。

洛谷 P8023 [ONTAK2015] Tasowanie

直接归并会出现的问题是,因为序列不是有序的,所以无法处理两序列当前位置的值相同的情况。

先考虑如何暴力解决这个问题,如果 ai=bja_i=b_jai=bj,则判断 ai+1a_{i+1}ai+1 是否等于 bj+1b_{j+1}bj+1 ,如果不相等,则取小的一列更优,如果相等,则继续判断 ai+2a_{i+2}ai+2bj+2b_{j+2}bj+2 是否相等,以此类推。

暴力的时间复杂度直接挂到了 O((n+m)2)O((n+m)^2)O((n+m)2),问题在于暴力判断 aia_iaibjb_jbj 之后相等的值。考虑二分其后值相等的序列长度,Hash 判断序列是否相等,则复杂度优化到 O((n+m)log⁡(n+m))O((n+m)\log(n+m))O((n+m)log(n+m))

洛谷 P2601 [ZJOI2009]对称的正方形

经典题,二维回文。

与一维回文类比,使用二维 Hash,算三个 Hash 判断上下和左右对称,枚举中间点并二分正方形边长。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值