为省赛整理的常用算法模板,数据结构部分
字符串相关算法
KMP算法
1 | int strStr(string s, string p) { |
Manacher算法
求字符串的最大回文子串问题
1 | // Manacher 算法 |
并查集
1 | int par[maxn]; |
带权并查集
1 | void init() |
树状数组
解决查询区间和线段树类似可解的问题,注意数组从1开始计数,初始化的时候要注意第一个元素(可以在代码中考虑)。
1 | int N,c[maxn+1]; //树状数组 |
左偏树
1 | int merge(int r1,int r2) //合并操作,所有左偏树的基础 |
线段树
所谓线段树就是利用树中的结点来维护一段区间的相应的值
1 | #define lson l,m,rt<<1 |
线段树中区间替换和区间增减
lazy思想:对于一个结点进行操作,先记录下来一开始不操作,直到要查询某个结点的值时,再进行更新,查询某一个结点区间时,先对左右结点的值进行更新,再确定具体的值
1 | //区间替换 lazy思想 |
可持续化线段树(主席树)
在普通的线段树的基础上记录了历史版本
1 | struct segnode |
通过代码我们可以发现,充分利用已有数据生成新的线段树的关键在于生成节点的函数中引用&