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大

树链剖分

 

在一棵树上进行路径的修改、求极值、求和,这个时候应该马上想到树链剖分

树链剖分解决子树问题

树剖+线段树可以维护的是树上的点权区间,如果是边权区间的话就要边转点。