首页 > 其他分享 >【W的AC企划 - 第十期】字符串哈希

【W的AC企划 - 第十期】字符串哈希

时间:2023-10-15 22:14:07浏览次数:41  
标签:AC 暴力 tt 第十期 哈希 KMP 字符串 string

往期浏览

第一期 - 博弈论

第二期 - 前缀和

第三期 - 二分与三分算法

第四期 - 莫队算法

第五期 - 线段树(暂时未公开)

第六期 - 位运算

第七期 - 树上分治

第八期 - Tarjan缩点

第九期 - 网络流

第十期 - 字符串哈希

题单

1003F(\(\tt *2200\);字符串-哈希、字符串-KMP、暴力)

string - hashing List #5 | 比较难受的一题,原先的字符串板子传递变量的时间过慢导致一直超时,但是难度并不是很高。

首先观察到单个字符串长度极长但是数量很少,于是想到使用字符串哈希将总长度缩小,属于比较典的思路,使用 map 即可轻松做到这一点;随后暴力枚举全部匹配情况后依次统计次数即可,借助 KMP 可以在 \(\mathcal O(N^3)\) 完成。注意,如果使用 find 函数规避 KMP ,那么理论最坏复杂度会上升到 \(\mathcal O(N^4)\),我一开始是由于读错了题,以为至多可替换两段内容,于是没有使用 KMP,导致超时。

另外还有一点需要注意的是,上述的复杂度需要简单修改 KMP 函数使之能够对哈希后的数组进行匹配,如果使用 to_string 函数对哈希后的数组再处理回字符串后运行 KMP(没错,我一开始真的这样写了),复杂度会上升到最坏 \(\mathcal O(N^2 \cdot \sum_{i=1}^{200})\),这样依旧会超时。

另外,注意到我们是暴力枚举后进行匹配,未被枚举到的部分其实不需要进行匹配,所以本题有一个修改 KMP 匹配范围进行优化的方法,使得单次只匹配使用到的那部分内容,可以简单学习。根据这一优化方式,抽象了一个“统计原串中某个子串重复出现的次数”的板子。

7D(\(\tt *2200\);字符串-哈希)

string - hashing List #4 | 哈希判回文,较模板。单哈希即可通过,双哈希有超时风险。观察到有较高效的做法 See

25E(\(\tt *2200\);暴力、字符串-哈希、字符串-KMP)

string - hashing List #3 | 暴力枚举后运行两个字符串算法,较模板。写这题的过程中综合了之前做过的字符串哈希的题目形成了一个较为系统的哈希相关封装。

1200E(\(\tt *2000\);字符串、暴力、哈希)

string - hashing List #2 | 字符串后缀哈希,感觉是很典的题目。

514C(\(\tt *2000\);字符串、数据结构-字典树、搜索、暴力、哈希)

注意到串仅由三个字母构成。方法一是很显然的,建立字典树后在树上进行搜索匹配串:针对匹配串的每一位,暴力枚举其三种不同构成,最终以 \(\mathcal 3\cdot \sum N\) 的复杂度完成搜索。针对该方案有如下优化:\(\tt ^1\) 不使用 auto 进行搜索,而是直接用单独的函数进行,前者在实现上花费的时间更长一些;数组不留余量,使用 \(\tt 0-idx\) 法,这一优化可以提速近乎一倍,推测原因是减少了数组跳转的次数,应当引起注意。

string - hashing List #1 | 下面介绍字符串方面的方法:字符串哈希。本题使用单哈希需要将模数固定在 \(10^{10}\) 量级以上,不然会撞;如果是双哈希则没有特别的限制。属于字符串哈希的模板题,但是需要手写一个 \(\mathcal O(1)\) 进行某一位修改的函数(本质上是与方法一暴力修改一样的思路),比较考验对哈希过程原理的理解。

标签:AC,暴力,tt,第十期,哈希,KMP,字符串,string
From: https://www.cnblogs.com/WIDA/p/17766310.html

相关文章

  • ACCESS 混淆加密解密
    考虑到这样一个场景,程序只给用户使用到一定期限,如果用户没有新的KEY,将不能再使用程序.所以才有了下面这个想法.考虑不到位的地方,希望大家指正一.数据表内有两个字段,A存储着过期日期,B字段存储着用户登陆日期,这里要重点说一下,如果用户打开程序时,电脑上的日期大于B字段的日......
  • 哈希 + 变量 + 存储
    哈希码哈希值、哈希码:hashCode()方法返回的是一个整数值,称为哈希码(HashCode),存在的主要意义是在散列表(HashTable)等数据结构中帮助快速定位对象其他存在意义:快速查找,散列集合(散列表(例如HashMap、HashSet)等集合使用哈希码来实现元素的快速检索通过哈希......
  • access MD5加密
    PrivateConstBITS_TO_A_BYTE=8PrivateConstBYTES_TO_A_WORD=4PrivateConstBITS_TO_A_WORD=32Privatem_lOnBits(30)Privatem_l2Power(30)PrivateFunctionLShift(lValue,iShiftBits)IfiShiftBits=0ThenLShift=lValueExitFunction......
  • remotion 基于react 创建视频的框架
    remotion可以让我们直接基于react创建视频,使用到的技术webgl,css,canvas,svg说明对于希望使用web创建使用的场景这个是一个不错的选择(比如营销动画),很值得学习下参考资料https://www.remotion.dev/docs/https://github.com/remotion-dev/remotion/......
  • 3-ocserv基于pam_access模块进行用户访问控制
    ocserv基于pam_access模块进行用户访问控制一、配置ocserv的PAM文件打开/etc/pam.d/ocservvim/etc/pam.d/ocserv在默认/etc/pam.d/ocserv配置中的@includecommon-auth下方插入pam_access.so模块进行用户访问控制:authrequiredpam_access.so请确保这行在auth......
  • 接口interface
    1. 接口的底层结构体iface和eface,区别在于iface描述的接口包含方法,而eface则是不包含任何方法的空接口:interface{}1.1iface源码typeifacestruct{ tab*itab dataunsafe.Pointer}typeitabstruct{ inter*interfacetype _type*_type link*itab hash......
  • CF1872B The Corridor or There and Back Again
    CF1872BTheCorridororThereandBackAgain观察第二组样例的解释,注意这句话:“第二个陷阱限制了你”。这启发我们计算经过每个陷阱之后最多还能向前走到哪里,然后取\(\min\)得到答案。现在的问题是如何求出每个陷阱限制的最远可到达点。由于要求折返,因此对于第\(i\)个......
  • Exactly Once 语义在Flink中的实现
    数据流和动态表SQL和流处理的区别流式数据是一种实时生成的数据,而在一般的数据表中存储的数据肯定是有限的,这就会产生矛盾,由此就需要一种新表来存储流式数据,动态表就产生了。动态表动态表与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它......
  • Acwing.第125场周赛
    比赛链接数量给定一个正整数n,请你计算[1,n]范围内一共有多少个正整数满足能被2整除,但不能被3整除。输入格式一个正整数n。输出格式一个整数,表示满足条件的整数的数量。数据范围前3个测试点满足1≤n≤100。所有测试点满足1≤n≤10000。思路:一个比较简单的模拟......
  • Oracle分区表技术详解
    Oracle是如何存储数据的?逻辑存储与物理存储在国企或者一线大厂,一般都会选择使用Oracle数据库,程序通过mybatis等持久层框架访问Oracle数据库,指定表空间,表空间内包含若干张表,表中存有行数据,行数据以行片段的形式存储在数据库块中,①当插入的行太大,无法装入单个块时;②或因为更新的......