10.1-10.7 | KMP+RMQ+后缀数组 三个知识点保证70+题 | √ |
10.8-10.14 | 字典树+AC自动机+序列 保证60+题 | √ |
10.15-10.23 | ST+Treap+Lcp 保证60+题 | √ |
10.24-10.30 | 分治+树链剖分+根号算法 保证50+题 | √ |
每个知识点的应用场景
并查集:
朋友圈问题
图的连通性
优化其他算法加速,这个可以尝试
家庭财产问题,亲戚问题
树状数组
最基本的区间查询及单点修改
树状数组的区间修改,使用差分的思想
二维树状数组,这个比较难,有的还可能会和容斥定理结合
树状数组求逆序对:一般想到逆序对可以使用归并排序,但离散化加树状数组是一个更加快捷的方式
树形树状数组,树状数组与树的集合,常见方法为重新编号,并记录新编号节点的管辖区域。在求解子树权值和的时候还是相当实用的。但这个应用需要建边,要用到链式前向星,在比赛中遇到可以直接跳过。
树状数组求指定长度单调子序列,单调队列求逆序对的升级版。需要排除两数相等的情况,同时计算多区间符合数量
更多情况下,树状数组要与其他算法合用(如二分答案、前缀和优化之类的)才能发挥出最大的威力
线段树
最基本的单点更新,单点查询
然后就是区间更新,区间查询
最大区间子段和,最大前缀,最大后缀,最大子段和
二维矩阵的区间问题使用二维线段树,基础模板题可以做
还有区间合并问题数据大的话使用线段树
区间染色问题可以用线段树来维护
扫描线问题
线段树和树状数组不同的是,树状数组只能维护前缀“操作和”(前缀和,前缀积,前缀最大最小),而线段树可以维护区间操作和。
RMQ
区间最大值最小值问题
还有二维的思路和一维一样
RMQ还可以和其他算法结合使用
树的直径问题使用树型DP或者DFS都可以
KMP
寻找最小循环节
寻找循环节的个数
求最长公共子序列
还有各种字符串的匹配
二叉树B是否为二叉树A的子树
后缀数组
单个字符串相关问题,先构造后缀数组,然后求Height数组
可重叠的最长重复子串问题,求Height数组的最大值
不可重叠的最长重复子串问题,熟练掌握Height数组的性质
分段的思想在后缀数组相关问题中很常用
可重叠的 k 次最长重复子串,一般二分来做,只需判断当前段内是否出现k个后缀即可。
重复出现子串计数问题,比较简单的SA题
Ans=∑max(Height[i]−Height[i−1],0)
不相同子串计数问题,就是n−sa[k]+1−height[k]个子串。
字典序第K子串问题,二分找
连续重复子串问题,枚举串S长度k,如果Rank[1]和Rank[k+1]的Height=|L|−k那么当前答案合法。
重复次数最多的连续重复子串问题,枚举子串长度k,看这个长度对应每个位置之间的LCP是否等于k最长能扩到哪里,就是重复出现次数。
一个字符串在所有字符串中出现次数问题
字符串子串重复出现k次问题,SA+线段树维护
字符串不同种连续子串问题,这个应该算是“前缀数组”吧。具体来说就是将字符串翻转后求一边SA,此时所得就是原串的前缀数组。
后缀数组一直是我的噩梦,希望比赛遇不到吧。
字典树
字符串检索问题
词频统计问题
字符串最长公共前缀问题
字符串搜索的前缀匹配问题
作为其他数据结构和算法的辅助结构,如后缀树,AC自动机等
AC自动机
给出L个模式字符串(加总长度为N),以及长度为M大文本,要求从大文本中提取每个模式字符串出现的位置。比KMP的复杂度要低
给你N个模板串和一个文本串,问你这些模板串在文本串中最多出现了多少次
带权值的AC自动机一般要和DP相结合。
现在要你推断一个长度=n的由小写字母构成的字符串S有多少种组成方式,和DP结合
Treap
这个我感觉使用的话就是查询第K大的数,删除,修改等操作其他的用法还没见到
还有区间查询第K大
树链剖分
在一棵树上进行路径的修改、求极值、求和,这个时候应该马上想到树链剖分
树链剖分解决子树问题
树剖+线段树可以维护的是树上的点权区间,如果是边权区间的话就要边转点。