分治:
分治即分而治之,通过将一个大区间分成两个子区间,从而将一个大问题分成两个子问题
对于任意一个区间,将其分成左右两部分,然后根据答案的所在,递归调用不同的部分并统计答案即可
整体二分:
大概可以理解为决策单调性的分治,可以解决区间第k小或第k大的问题
(其实我自己也不是很难懂啦)
CDQ分治:
一般的分治是通过递归调用左区间和右区间来计算答案,而CDQ分治则是通过处理左区间对右区间的影响来计算答案,这是他们最大的区别
与普通分治相比,CDQ分治常数小,所占空间也小,但由于我们要用合理的顺序解决操作和询问的关系,处理左边对右边的影响,逐步得到所有答案,因此CDQ分治是一个离线算法,比较经典例题的有多维偏序问题
点分治:
点分治是一种基于树的重心的算法,将树上的路径分为经过重心和不经过重心两种,然后利用重心的性质,可将递归层数控制在以内,因此是一种优秀的算法
图论:(给自己挖个坑,回头有机会再填上,这几天时间有点紧)
KMP:
在一个串中查找另一个串,我们如果暴力匹配,是一定会超时的,因为假设当前指针指向i,j,且,那么一定是从某个能再次匹配到i的位置开始重新匹配才有效
为了快速找到这个能再次匹配到i的位置,我们维护一个next数组,表示前i的字符组成的这个子串最长的相同前缀后缀的长度,这样可以跳过很多不必要的枚举
(我记得之前写了一道板子题,但学校OJ只能在校内打开,先借用一下wy老师的板子,回头再换回来)
维护next数组:
根据next匹配母串:
后缀数组:
Sharpland:这个玩意有点毒瘤,先放一边