2026年6月29日

树上启发式合并

摘要: 什么是启发式算法? 启发式算法就是根据人们的直觉对一些算法进行优化(这很启发式了),典型的就是并查集的路径压缩 fa[x] == x ? x : find(fa[x]) 让高度小的树成为高度较大的树的子树,这个优化可以称为启发式合并算法。 AC自动机里面对fail指针绕圈的优化也是启发式算法。 树上 阅读全文

posted @ 2026-06-29 10:47 我不爱吃汉堡 阅读(4) 评论(0) 推荐(0)

AC自动机

摘要: AC 自动机用于解决多模式串匹配的问题,本质上是 trie + Kmp 思想优化匹配过程,例如:文本串aaasssddvbasd ,两个模式串:aass,ddssa。虽然可以设置多个指针同时匹配,但是时间也没快多少,我们形象化的感知时间复杂度:在每个位置的末尾试图往前匹配每个目标串,时间复杂度显然为 阅读全文

posted @ 2026-06-29 10:44 我不爱吃汉堡 阅读(7) 评论(0) 推荐(0)

Manacher

摘要: Manacher 算法,俗称马拉车算法,用于求解一个与字符串中所有回文串。 一个字符串的回文串子串指该字符串的子串满足回文要求。 比如:ssaasssvaa 中 ssaass 就是一个源字符串的回文子串。 把回文子串的中心叫做回文中心,当一个串为偶长度时,其回文中心为[n/2, n/2 + 1],当 阅读全文

posted @ 2026-06-29 10:43 我不爱吃汉堡 阅读(3) 评论(0) 推荐(0)

KMP

摘要: \(\pi(s)\)表示一个字符串 s 的最长真公共前后缀长度。 比如:abacabab 它的 pi 值为 2,a a它的 pi 值为 1。 前缀函数\(\pi[i]\)表示:一个字符串 s 的 [0, i] 前缀的 pi 值。 形式化的:\(\pi[i] = \max_{k = 0}^{i}[k: 阅读全文

posted @ 2026-06-29 10:42 我不爱吃汉堡 阅读(6) 评论(0) 推荐(0)

LCA及树链剖分

摘要: 树上最近公共祖先 树上最近公共祖先简称 LCA,在有根树里面,两个结点的 LCA 指的是两者往根节点爬的过程中路径第一次重合的那个结点。 LCA 具有以下几个性质: LCA(x) = x,即一个结点的最近公共祖先是自己。 如果 x 是 y 的祖先,那么 LCA(x, y) = x。 如果 x,y 并 阅读全文

posted @ 2026-06-29 10:27 我不爱吃汉堡 阅读(6) 评论(0) 推荐(0)

树状数组

摘要: 前言:树状数组仅可以解决线段树问题的子集:单点修改 + 区间查询。‘ 它利用的是区间的可差分性(可减性)以及位运算相关的知识构建一颗类似压缩版的线段树。 它相较于线段树的优点 时间复杂度为严格的 O(logn),具有较小的常数;空间复杂度为 O(n)。 实现起来简单,往往仅需十几行的代码。 相较于线 阅读全文

posted @ 2026-06-29 10:23 我不爱吃汉堡 阅读(4) 评论(0) 推荐(0)

高斯消元

摘要: 高斯消元法用于解决 n 元一次加法方程组、异或方程组、同余方程组。 加法方程组 高斯消元法解决加法方程本质上是对我们小学学过的消元法一样。 需要用到矩阵初等行变换: 矩阵中可以任意交换两行的数值。 矩阵中可以对任意一行的每一列的值进行相同的初等运算 + - * / %。 其实这两个变换对应的操作就是 阅读全文

posted @ 2026-06-29 10:22 我不爱吃汉堡 阅读(2) 评论(0) 推荐(0)

数位dp

摘要: 前言:为什么会想到学习数位dp,是因为群友问了一个蓝桥杯国赛的题要用数位dp解,然后闲的无聊就来学习数位dp了。 数位dp的尝试方式大都不算特殊,绝大多是都是线性展开的,类似从左到右的尝试。 数位dp是在数组的每一位上展开而已。 不同的题目有不同的限制,数位dp解题的核心在于:可能性整理 + 排列组 阅读全文

posted @ 2026-06-29 10:21 我不爱吃汉堡 阅读(4) 评论(0) 推荐(0)

树上背包

摘要: 书上背包 -> 树型dp 和 背包 结合的问题,对于背包问题如果熟悉的话其实是很简单的一个算法。 树上背包模板 P2014 [CTSC1997] 选课 题目大意: 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课 阅读全文

posted @ 2026-06-29 10:12 我不爱吃汉堡 阅读(4) 评论(0) 推荐(0)

格雷码

摘要: https://ac.nowcoder.com/acm/contest/120564/C 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码。 格雷码的输出方式 void solve() { int n; cin >> n; int tol = 1 << n; for 阅读全文

posted @ 2026-06-29 10:10 我不爱吃汉堡 阅读(4) 评论(0) 推荐(0)

导航