• Hash(哈希)选做


    洛谷 P3501 [POI2010]ANT-Antisymmetry

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

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

    洛谷 P2852 [USACO06DEC]Milk Patterns G

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

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

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

    L e n ≥ 3 Len\geq3 Len3,所以只需找到 L e n = 3 Len=3 Len=3 的等差子序列即可。枚举中项,对于每一个 A i A_i Ai 判断是否存在 A i + k A_i+k Ai+k A i − k A_i-k Aik A i A_i Ai 的异侧。

    建立一个长为 N N N 的序列 X X X,初始全为 0 0 0,从左到右扫一遍 { A i } \{A_i\} {Ai},每次将 X A i X_{A_i} XAi 设为 1 1 1,那么如果不存在 A i + k A_i+k Ai+k A i − k A_i-k Aik A i A_i Ai 的异侧,意味着所有的 A i + k A_i+k Ai+k A i − k A_i-k Aik 已经被加入到 X X X 中,那么此时以 X A i X_{A_i} XAi 为中点,两端不超过边界的 X X X 的子串(必定是前缀或后缀)一定为回文串

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

    洛谷 P8023 [ONTAK2015] Tasowanie

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

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

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

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

    经典题,二维回文。

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

  • 相关阅读:
    【算法100天 | 19】链表拆分、深拷贝
    java毕业设计成品源码网站基于JSP的网上订餐管理系统|餐饮就餐订餐餐厅
    【HDU No. 5057】序列操作 Argestes and Sequence
    微信如何一次自动回复多条信息?
    Day7_9 Java学习之JDBC访问MySQL数据库
    (2)数据库mongodb 终端 和 vscode创建数据库 数据导入导出
    JVM 参数及调优
    【Java】Spring boot快速上手(一):葵花宝典
    前端超级好用网站整理
    用户画像的基本架构
  • 原文地址:https://blog.csdn.net/Wu_while/article/details/127572994