摘要: 背包、区间 dp、树形 dp、DAG上 dp 阅读全文
posted @ 2024-03-01 14:17 lgh_2009 阅读(5) 评论(0) 推荐(0) 编辑
摘要: 快读 template<typename T>void in(T &a) { T ans=0; bool f=0; char c=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1; for(;c>='0'&&c<='9';c=getchar 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 三分法 流程 三分法可以求区间上一个单峰函数的最值。顾名思义,三分法与二分法相似,但是会把区间分三段。 板子 P3382 在区间 \([l,r]\) 中任取两点 \(lmid,rmid\) (设 \(lmid\leq rmid\)),分类讨论。 当 \(f(lmid)>f(rmid)\),说明 \( 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 概述 贪心算法指每一步都选当前的最优解,不考虑这一步对后面的影响。使用时需要先证明贪心策略的正确性。一般使用反证法或数学归纳法证明。 例题 P1080 这一题要求的是一个最优的排列,考虑反证。假设当前的排列最优,尝试交换相邻两个大臣生成一个新的排列。 设前面所有人左手的乘积为 \(S\)。交换前两个 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 概述 做搜索题时,直接朴素 DFS 或 BFS 可能会寄,这时需要对搜索方法进行改进。 下面以 P1379 八数码问题为例。 双向广搜 如果直接广搜,搜索树会比较庞大。这题中由于终点已知,可以从起点和终点同时广搜,可以将复杂度的指数减半。 具体来说,维护两个队列,从起点和终点交替扩展队列,搜索的两端 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(5) 评论(0) 推荐(0) 编辑
摘要: 概述 双指针是一种简单的技巧,通过两个指针维护一些具有单调性、可快速增删的区间信息。 一般要求的是求满足某个条件的最长/最短区间。当一个指针增加时,单调性要求满足这个条件的分界点是单调递增的。枚举一个指针,让另一个指针不断增加直到满足条件即可。两个指针都只会遍历一遍,复杂度 \(O(n)\)。 例题 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(5) 评论(0) 推荐(0) 编辑
摘要: HDU 7220 一个 \(01\) 串,可以翻转长为奇数的区间,求可能得到的最小字典序。 翻转只会在奇偶性相同的位置造成变化,只用长度为 \(3\) 的翻转,可以任意调换奇偶性相同的位置,那么将奇数位与偶数位分别排序即可。 一道数论题: 求 \(\sum_{i=1}^n\sum_{j=1}^m\m 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 前缀和 一维前缀和 前缀和指数列前 \(n\) 项和,比如数组 \(a\) 的前缀和为 \(sum_i=\sum_{j=1}^ia_j\)。可以通过递推计算前缀和: for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]; 前缀和可以做到 \(O(1)\) 查询静态区间和 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(5) 评论(0) 推荐(0) 编辑
摘要: X 算法 用于解决精确覆盖问题,即给定一个零一矩阵,选出若干行让每一行恰有一个一。 \[\begin{bmatrix}0&0&1&0&1&1&0\\1&0&0&1&0&0&1\\0&1&1&0&0&1&0\\1&0&0&1&0&0&0\\0&1&0&0&0&0&1\\0&0&0&1&1&0&1\en 阅读全文
posted @ 2024-03-01 09:42 lgh_2009 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 最小生成树 定义 生成树:一个连通无向图的生成子图,同时要求是树。 最小生成树:边权和最小的生成树。 Kruskal 算法 Kruskal 算法是一种基于贪心的最小生成树算法,好写易懂且复杂度低。 流程很简单,首先对边排序,每次选最小的边,如果没有形成环就加入生成树。 可以这样理解,如果一条边加入生 阅读全文
posted @ 2024-03-01 09:39 lgh_2009 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 字符串哈希指的是用一个函数将一个字符串映射为一个整数。 OI 中常用多项式哈希,即选定基数 \(base\) 和模数 \(mod\),则 \(f(s)=\sum_{i=1}^n s_ibase^{n-i}\pmod{m}\)。可以把这种哈希理解为一个 \(base\) 进制整数对 \(mod\) 取 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(4) 评论(0) 推荐(0) 编辑
摘要: KMP void getnxt(int m,char t[],int nxt[]){ nxt[1]=0; for(int i=2,j=0;i<=m;i++){ while(j&&t[j+1]!=t[i])j=nxt[j]; if(t[j+1]==t[i])j++; nxt[i]=j; } } int 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 定义 子序列自动机是接受且只接受一个串的子序列的自动机。 子序列自动机有 \(n+1\) 个状态,也就是主串的下标加上 \(0\),起始状态为 \(0\)。令自动机的转移函数为 \(to_{i,c}\),则 \(to_{i,c}\) 为 \(i\) 之后第一个字符 \(c\) 的位置(第一个是因为这 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 定义 扩展 KMP(Z 函数)可以求主串的所有后缀与模式串的最长公共前缀。 约定字符串下标以 \(1\) 为起点。定义字符串 \(t\) 的 Z 数组 \(z_i=\operatorname{lcp}(t,t[i,m])\),即串与每个后缀的 \(lcp\);主串 \(s\) 与模式串 \(t\) 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 定义 定义字符串从第 \(i\) 个字符开始的后缀为 \(suf_i\)。 后缀数组一种是处理字符串的有力工具。将字符串的所有后缀按字典序排序,则 \(sa_i\) 表示排名为 \(i\) 的后缀的起始位置,\(rk_i\) 为第 \(i\) 个后缀的排名。 倍增算法 直接排序,由于要进行字符串的比 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 概述 Manacher 算法可以在 \(O(n)\) 的复杂度中求出一个字符串的最长回文子串。 过程 回文串有奇数长度和偶数长度两种,这就比较麻烦。如果把每两个字符之间加一个特殊字符,就只有奇数长度的回文子串了。这里为了方便处理边界还在首尾各加了一个特殊字符。 cin>>temp+1,n=strle 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 概述 一种字符串匹配算法,是前缀函数的一个应用。 下文的字符串为 1-index。 前缀函数 对于字符串 \(s\),定义 \(\bold{Border}(s)\) 为对于 \(i \in \left[1, |s|\right)\),满足 \(pre_i=suf_i\) 的字符串 \(pre_i\) 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 自动机 OI 中所说的“自动机”一般都指“确定有限状态自动机”。 自动机可以看作一张图,有五个组成部分:字符集 \(\sum\)、状态集合 \(Q\)、起始状态 \(s\)、接受状态集合 \(F\)、转移函数 \(\delta\)。 字符集可以输入一个串,这个串的字符属于字符集。状态从起始状态转移。 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(10) 评论(0) 推荐(0) 编辑
摘要: BFS 过程 如果图的边权只有一种,那么在 BFS 的过程中松弛即可。 否则如果有两种边权,一种为 \(0\),使用 0-1 BFS。使用双端队列,对于大的边权入队尾,\(0\) 边权入队首即可。 与 Dijkstra 和 SPFA 的关系 这两种算法与 BFS 的过程很像。 将 BFS 的队列换成 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 拓扑排序是一个 DAG 的所有顶点的线性序列,满足每个顶点出现且只出现一次和如果有一条 A 到 B 的路径,在序列中 A 出现在 B 的前面。 可以用一个类似 BFS 的方式(又叫 Kahn 算法)解决: 首先统计入度,如果一个点没有入边就加入队列,代表当前可以输出。 每次取出队首,删除这个点,把这 阅读全文
posted @ 2024-03-01 09:38 lgh_2009 阅读(0) 评论(0) 推荐(0) 编辑