
数据结构与算法
文章平均质量分 82
lyh20021209
山大软院在读 纯小白
展开
-
字符串哈希
首先对于任意索引i,如果target[i:j]有匹配前缀,那么target[i:j-k](其中j-k≥i)一定有匹配;若target[i:j]没有匹配,那么target[i:j+k](其中k≥0)一定没有匹配。因此可以把所有前缀的哈希置入一个set的列表sets,sets[j]表示前缀长度为j的字符串的哈希值的集合。其实,“target子串的最长前缀匹配”,其实就是主站45题跳跃游戏Ⅱ的贪心。不过字典树的O(nk)显然是超时的,n是words数组长度,k是words数组元素长度总和。原创 2024-12-17 21:11:23 · 337 阅读 · 0 评论 -
Prime Sieve
暴力筛的想法很简单,就是2到i-1每个数看一眼能不能整除,都不能就是素数。原创 2024-10-21 15:28:16 · 486 阅读 · 1 评论 -
Segment Tree
例如第一个方块[x,y],那么[x:x+y-1],第二个方块[z,x-z],则[z:x-1],但实际上这俩是贴边的。这个时候[1,2]的最大值很显然为10(例如我们要在[1,2]上放一个方块,他就得从10开始算了),但[1,1]的值为0,[2,2]的值为10,因此取左右子树最大值,也即10。对于回溯(pushup)我们可以发现,当一个新的方块落下时,他应该查找[l,r]中最大的高度并且累加上去。这个写法在左半部分是没问题的,即[x,mid],因为这个区间是肯定要查的。从1开始,接收一个从0开始的数组。原创 2024-08-01 13:52:51 · 959 阅读 · 0 评论 -
dsa加训
Follow oi-wiki原创 2024-07-21 11:36:22 · 425 阅读 · 0 评论 -
BitWise-Operation
之前有个《位运算trick》的文章,也是讲位运算的。不过最近灵神发了个位运算的题单。这篇就按题单来了。原创 2024-04-05 20:48:13 · 822 阅读 · 0 评论 -
数学结论在dsa中的应用
然后枚举被删除的,从剩下的里面挑一个最大的,一个最小的,相减,更新答案。如下图,红色线段是欧式距离,深蓝色线段是曼哈顿距离,灰色射线是新坐标系x轴和y轴,黑色射线是原坐标系x轴和y轴,橙色线段是切比雪夫距离,就等于原坐标系的曼哈顿距离,也就是橙色线段的长度等于左边图中两条深蓝色线段的长度。当我们把操作后的坐标投影到原先坐标系的x轴或y轴上后,原先两个点之间的距离,就变成了投影在x/y轴上的距离,这是因为投影把线段缩小到原来的1/sqrt(2)倍,正好和扩大sqrt(2)倍兑掉了。这就引入了切比雪夫距离。原创 2024-04-04 16:05:50 · 446 阅读 · 0 评论 -
Binary Indexed Tree
比如你要查[1,7]的,你直接一看7的lowbit,1,那就算上c[7]=[7,7],然后跳到7-1=6去。再一看4的lowbit,4,那就算上c[4] = [1,4],然后跳到4-4=0去,到此跳出了树状数组,查询结束,返回和。例如你拆[1,13],那么递归到底部必然拆了[1,1] ⇒ [1,1],[1,2] ⇒ [2,2],[1,3] ⇒ [1,2] + [3,3]…那多出来的部分单算,比如[2:6],索引2上的1单独算就行了,复杂度O(n/B+B),由于B大概率比n小,那就是O(n/B))原创 2024-03-06 14:55:05 · 897 阅读 · 0 评论 -
多叉树上的操作
这里的树指的是有根树。原创 2024-02-21 11:58:40 · 432 阅读 · 0 评论 -
Hash哈希
VP双周赛123T3。一直想在Hash表里存每种数字出现的索引,查询nums[i]±k的所有可能索引,前缀和相减得到子数组和维护最大值。最后不出意外的T了。既然要找之前的最小前缀和,为啥不在Hash表里直接维护每个数字对应的最小前缀和呢?注意子数组是闭区间,前缀和数组里加个哨兵即可。然后这道题实际上不需要前缀和数组,滚动一个前缀和就可以了,闭区间滞后一个元素即可。原创 2024-02-20 19:58:47 · 388 阅读 · 0 评论 -
Lowest Common Ancestor
LCA:LCA_TARJAN/倍增原创 2024-01-26 18:59:44 · 699 阅读 · 0 评论 -
分组循环A
对于每个分组,如果可以交换,则扩展分组的窗口,直至达到尽头或者不能交换为止。这样这个分组里的数都是可以任意交换的,因此就可以对这个分组进行排序。对每个分组排序后如果能使得整个数组有序,那么就成功。分组查询每段平滑下跌阶段。贡献是(l+1)*l/2(等差数列),累加即可。分组检查连续相同子串长度,超过2就缩减到2,拼到答案里即可。这题我比赛时用的并查集。看灵神视频学了个分组循环的做法。分组记录0/1子串长度,维护最大值,最后比较。分组查询交替子数组长度,维护最大值。分组记录每个连续字符子串长度,维护最大值。原创 2024-01-23 00:09:24 · 435 阅读 · 0 评论 -
QUEUE
维护一个单调增的单调队列。也就是如果队尾元素大于当前前缀和的话,就应该把队尾踢掉。这是因为:当后续前缀和查询队列中维护的前缀和时,如果当前前缀和与其之差≥k的话,那么与一个更小的前缀和之差也一定≥k。由于我们是正序的,所以踢走队尾的前缀和的索引一定更靠后。也就更接近日后查询时的索引。之所以不用单调栈而是一个单调的双端队列,是因为栈没办法查询或操作栈底元素。我们想要最短区间,是肯定要查看之前最早的检查点的,也就是踢人的时候不能从队尾踢,队尾的前缀和要留给更后面的位置查询。子数组元素和显然要算前缀和。原创 2024-01-20 16:45:51 · 405 阅读 · 0 评论 -
字符串匹配
细节在代码中看不懂的可以参照:如何更好地理解和掌握 KMP 算法?- 阮行止的回答 - 知乎。原创 2024-01-16 14:25:34 · 414 阅读 · 0 评论 -
DP:数位DP
数位DP的大致思想:枚举每一位能选取的合法值。原创 2024-01-16 13:40:19 · 1189 阅读 · 0 评论 -
Fancy
专门记录一点思维题。原创 2024-01-11 20:01:18 · 463 阅读 · 0 评论 -
Union-Find
并查集判连通:由于我们想要的是最大安全系数,所以倒着搜各个安全距离对应的点集。如果发现它的邻居的安全距离大于等于它的,那么可以把它的邻居对应的等级类直接归到这个点对应的等级类。由于我们倒着搜答案,因此这个等价类的门槛会越来越低,直至把所有点都囊括进去,那个时候安全系数也就只能为0了。预计算写的暴力,判断写的深搜。这题预计算所有点的安全距离的方式应该是多源BFS。判断连通性的方式是DSU。所以不放在二分题单里,放在DSU。核心想法:如果这个元素的源头不是他自己 说明它被归到别的等价类去了,深搜它的源头(链)原创 2024-01-11 19:36:46 · 659 阅读 · 0 评论 -
STACK
如果当前元素位于这个应有的元素后方,那么需要补齐中间的;如果在前方,说明上一轮abc还有缺,需要补上;如果正好就是这个应有元素,那么看下一个字符即可。维护下一个需要使用到的元素。例如上一个是a,那么下一个就是b。如果上一个是c,那么下一个是a。这题模拟栈即可,不需要真的用,因为一直访问的都是栈顶元素,所以维护一个栈顶指针即可。时间O(n)空间O(1)原创 2024-01-11 11:43:26 · 392 阅读 · 0 评论 -
DSSW:MAX
这里记录不定长滑窗:最长/最大值题单题解。原创 2024-01-07 15:00:36 · 386 阅读 · 0 评论 -
Fixed win size sliding window
这篇记录灵神题单中的定长滑窗环节,不跟之前的Sliding Window一起了。原创 2024-01-06 15:07:22 · 422 阅读 · 0 评论 -
单调栈:General
题面:设计一个算法收集某些股票的每日报价,并返回该股票当日价格的。当日股票价格的被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。实现price思路分析:现在假设我们先要统计第5天(索引从0开始),也就是价格为75的那一天的跨度。然后统计第6天,也就是价格为85的那一天的跨度。观察一下,可以发现85重复统计了第2到第4天(60,70,60)的数据,但实际上,如果我们明确知道了85≥75时,就可以复用75的统计,也就是自动筛掉(60,70,60)这组数据了。原创 2024-01-05 09:53:37 · 1012 阅读 · 0 评论 -
Differential
之前我有一篇 《差分+前缀和》的学习笔记,记录了差分的思想和基本用法。这里就只记录灵神题单的刷题记录。原创 2024-01-04 16:09:51 · 484 阅读 · 0 评论 -
大大大模拟
简单来说就是答案就在题面上,题目怎么说就怎么做即可。听起来很简单,做起来很难,很考验码力。想做大模拟的可以去试试csp的T3(一般都是大模拟),非常折磨人,动不动WA了,考验细节。原创 2024-01-01 00:30:41 · 437 阅读 · 0 评论 -
位运算trick
位运算本质上不是一种算法,而是一种trick,用来节约时间/空间的trick。背后常常有集合论、状态压缩等思想的支撑。这里探讨的位运算指的是其背后的指导思想而不是trick本身。因此对trick本身的证明就略过了。如果想获取位运算的知识图谱,以及集合论的一些基础知识。我在子集状压DP篇收录了相关图片(搬运别人的),可以在该博客找到。原创 2023-12-31 23:56:25 · 475 阅读 · 0 评论 -
BS:最大化最小值
和最小化最大值是一回事,二分板子。原创 2023-12-31 12:57:39 · 421 阅读 · 0 评论 -
子集状压DP
本来应该放到DP篇。但由于这个部分灵神单列了题单,我就按题单刷题记录单列一篇。位运算状压应该算是我入门第一个接触到的算法级别的trick。知识图谱也列出来了:因此本篇会略过位运算,仅将其作为工具。主要还是子集DP。原创 2023-12-30 22:00:49 · 1996 阅读 · 0 评论 -
Depth First Search(Brute Force->Memorized->DP)
整个过程就是暴力搜索→记忆化搜索→DP。原创 2023-12-30 12:15:04 · 369 阅读 · 0 评论 -
字典树/前缀树(Trie)
直接有道题教板子了。原创 2023-12-29 17:14:57 · 378 阅读 · 0 评论 -
Sliding Windows
本质为同向双指针。大致来说就是当要统计符合某一性质的区间数量时,可以考虑左右指针选取一个窗口,不停地扩展窗口,边扩展边统计,直至窗口大小达到区间长度上限或窗口不再满足该性质为止。原创 2023-12-29 12:36:44 · 447 阅读 · 0 评论 -
Greedy
贪心本质上是不可能反悔的,这和贪心算法的定义是矛盾的:贪心每次都选取当前的最优解,所以一旦反悔了,被反悔的那次选择就不叫贪心了。但有时候因为题目的特殊性质,在明确了一个贪心算法之后,我们使用数据结构记录下每次的贪心选择,在之后做出贪心选择时查询记录,如果不满足“全局贪心”的结论,就置换贪心选择,称为反悔贪心。原创 2023-12-25 20:10:28 · 387 阅读 · 0 评论 -
BS:最小化最大值
按照LC的尿性,最小/大化最大/小值,九成九的二分板子。暴搜一定是TLE的。这种题都有单调性质:参数值越xxx,结果越xxx。原创 2023-12-24 16:42:33 · 414 阅读 · 0 评论 -
Shortest Path
无/有向图,可带负边权。java比较笨,没inf这种标识符。我就用包装类作为边权了,含null。因此特判有点多。dp(k)(i,j)表示从i到j的最短路,这条路径上除了i,j这两个节点,序号最大为k。原创 2023-12-24 13:21:04 · 386 阅读 · 0 评论 -
Binary Search
我一般喜欢左闭右开,像这样,[lp,rp)因此rp初始化要记得+1,因为取不到的。原创 2023-12-22 17:19:07 · 458 阅读 · 0 评论 -
前后缀分解
差分+前缀和重在差分,前缀和不过用来还原而已前后缀分解重在区间查询优化。原创 2023-12-22 16:53:17 · 497 阅读 · 0 评论 -
差分+前缀和
差分、前缀和概念,实战应用原创 2023-10-07 17:04:41 · 113 阅读 · 1 评论 -
Dynamic Programming (DP笔记)
DP笔记原创 2023-10-15 10:06:17 · 240 阅读 · 1 评论