- 博客(88)
- 收藏
- 关注
原创 后缀自动机模板题详解:从算法思路到代码实现(以 P3804 为例)
你是否在为处理大规模字符串子串统计问题而发愁?后缀自动机(SAM)作为高效处理字符串的 “利器”,能在线性时间内解决子串出现次数、最长子串等复杂问题。本文以洛谷 P3804 模板题为例,手把手拆解 SAM 核心原理:从状态定义、构建过程到拓扑排序统计出现次数,结合详细代码注释与例题分析,帮你快速掌握这一算法。
2025-04-08 10:41:26
443
原创 图文详解!二分、前缀和、差分算法原理与实战应用全解析
二分、前缀和、差分算法是算法竞赛与编程实战中处理大规模数据的核心工具。本文以 P1083 借教室问题 为例,通过图文结合的方式,系统解析这三大算法的底层逻辑与优化技巧。
2025-04-06 16:58:21
602
原创 【算法优化】P1047 校门外的树:区间合并技巧,暴力解法与高效算法对比
本文以洛谷 P1047 校门外的树为例,深入讲解了两种经典解法:暴力标记法与区间合并优化法。通过对比分析,展示了如何通过区间合并将时间复杂度从 O (m*l) 优化至 O (m log m),并给出了完整的代码实现。无论是刚入门的算法新手,还是追求效率的进阶选手,均可通过本文掌握模拟题的核心思路与优化技巧,同时理解不同解法在实际场景中的适用差异。文章附带详细代码注释与复杂度分析,助力读者快速掌握问题本质。
2025-04-05 15:48:06
388
原创 KMP 算法全解析:高效实现字符串匹配与模板题详解
本博客以手写推导 + 代码注释的方式,从原理到实现全面解析 KMP 算法,适合算法入门者和竞赛备考者深入理解。
2025-04-04 21:10:27
475
原创 一文搞懂集合 Set:从基础到实战的 C++ 数据结构解析
注意:set容器没有push_back, pop_back这两种插入接口,只能用insert函数进行插入。如果向set容器中插入相同元素,不会报错,但是打印的时候会自动滤去多余的元素,一个元素只能有一个,而且打印结果是排好序了的。通过合理使用集合,可以显著简化代码逻辑并提升运行效率,特别适合需要快速去重和统计的场景。
2025-04-03 10:55:51
372
原创 【字符串处理】L1-101别再来这么多猫娘了
题目主要围绕对输入的字符串进行处理,包括读取包含违禁词的文本字符串,在该字符串中查找并统计特定的违禁词出现的次数,以及根据违禁词出现的次数对字符串进行不同方式的修改和输出。例如,将违禁词替换为特定的字符串,这些操作都涉及到对字符串的各种操作和处理技巧。输入样例输出样例输入样例2输出样例2。
2025-04-02 10:54:08
431
原创 【有外界干扰的BFS】经典题P2895Meteor Shower S
在有外界干扰的 BFS 题型中,通过预处理将干扰因素转化为可查询的数据结构,在状态转移时更新和检查干扰情况,以及在扩展阶段调整扩展规则和进行剪枝优化,可以有效地处理干扰因素,提高算法的效率和正确性。不同的干扰因素可能需要不同的处理方式,但总体思路都是围绕着提前处理、动态检查和合理扩展这几个方面展开。
2025-03-29 17:46:22
896
原创 《L1-006连续因子》用贪心策略 +√N 遍历,3 行代码找出最长连续因子序列!
选自《L1-006连续因子》。这种题型的核心难点在于和,需要同时掌握数论和基础算法技巧。在这道题中,我们运用(通过双重循环),在,避免了存储所有因子的开销。这种设计在保证正确性的前提下,显著提升了效率,尤其适用于大数值的场景。题目:630。
2025-03-27 17:21:59
314
原创 【BFS染色问题】P1162填涂颜色例题+核心逻辑
要判断一个数字 0 是否在闭合圈内,可以换个角度思考。不在闭合圈内的 0 是可以从方阵的边界出发,通过上下左右移动,只经过其他 0 到达的。所以我们可以从方阵的四条边界上的 0 开始进行广度优先搜索(BFS),将这些能从边界到达的 0 标记出来,那么剩下的未被标记的 0 就是在闭合圈内的。
2025-03-26 20:36:53
370
原创 从底层原理到实际应用:BFS 算法借助队列征服迷宫
在算法的世界里,迷宫类最短路径问题一直是经典且富有挑战性的存在。今天我们就来深入探讨一种强大的解决方案 ——BFS(广度优先搜索)算法。文章详细分析了该算法为何适用于迷宫问题,一步步拆解其算法思路,包括数据初始化和遍历过程。同时,还深入剖析了 BFS 算法的核心原理,着重讲解了算法中队列这一关键数据结构的具体操作,更有完整的代码示例供你参考。无论你是算法初学者,还是想提升解题能力的进阶者,这篇文章都将为你带来清晰且实用的指导,助你掌握用 BFS 算法解决迷宫类问题的技巧。
2025-03-26 16:10:12
1034
原创 【多源BFS经典题型】P1332血色先锋队(C++)
普通 BFS:代码简洁,适用于大多数最短路径问题。层序 BFS:便于分层控制,适合需要明确层数的场景。这道题中:两种方式都正确,因为感染时间仅依赖最短距离,与处理顺序无关。建议:在简单问题中优先使用普通 BFS;在复杂问题(如分层统计)中使用层序 BFS。
2025-03-25 11:28:34
1190
原创 【BFS算法】P1746离开中山路(C++)
本题使用广度优先搜索(BFS)算法来寻找从起点(x1, y1)到终点(x2, y2)的最短路径。BFS 算法基于队列实现,按照层次逐层扩展节点,因此可以保证找到的路径是最短的。
2025-03-24 15:52:49
605
原创 C++ 地图 + 配对组合!3 分钟吃透 map 和 pair 的黄金搭档
在C++编程中,数据结构的合理运用是解决复杂问题的关键。`map` 作为关联容器,以键值对为存储单元,为数据的高效查找与管理提供了强力支持;而 `pair` 作为基础模板类,专注于将两个不同类型的值组合为一个逻辑整体,是构建键值对的“基石”。二者在功能上深度耦合——`map` 的核心元素正是 `pair`,它们共同服务于数据的组织与操作场景,从简单的数据映射到复杂的业务逻辑实现,都少不了它们的身影。深入剖析 `map` 与 `pair` 的特性、操作及协作关系,不仅能帮助开发者更精准地驾驭数据处理,还能为
2025-03-21 16:26:01
690
原创 一文搞懂队列!C++ 实现 + BFS 应用 + STL 详解,轻松拿捏数据结构核心
队列作为计算机科学的基础数据结构,在算法设计与系统开发中无处不在!本文以 C++ 实战为核心,从 队列原理到 BFS 应用,带你 0 基础入门,轻松掌握:✅ 队列的 5 大核心操作(入队 / 出队 / 取头 / 判空 / 求大小)✅ 数组 vs 链表实现对比(含代码示例 + 性能分析)✅ STL queue 的底层逻辑与高效用法✅ BFS 算法中队列的关键作用(附迷宫最短路径代码)🔥 从基础操作到面试高频考点,一篇文章搞定队列!
2025-03-20 15:24:26
982
原创 算法必学!DFS 和 BFS 全网最详细对比 + 代码模板
是一种用于遍历或搜索树、图等数据结构的算法。其核心思想是尽可能深地探索分支,直到无法继续前进时回溯到上一个分叉点,转而探索其他分支。是一种用于遍历或搜索树、图等数据结构的算法。其核心思想是逐层探索节点,先访问离起点最近的节点,再依次向外扩展。掌握BFS的关键在于理解其层级遍历特性,并熟练应用队列数据结构。在解决最短路径、状态转移等问题时,BFS往往是更优选择。掌握DFS的关键在于理解其深度探索与回溯机制,并结合实际问题灵活运用剪枝和记忆化等优化策略。最短路径它最强,层级遍历是绝招。
2025-03-18 10:18:53
1017
原创 Python的糖衣炮弹 vs C的冰冷指针
C 语言C 语言函数定义有比较严格的格式。函数头包括返回类型、函数名和参数列表,参数列表中需要明确每个参数的类型。例如:函数的返回类型必须在函数定义的开头明确指定,函数体用花括号包围,函数内部通过return语句返回一个值,其类型必须与函数定义的返回类型兼容。Python 语言Python 函数定义使用def关键字。例如:不需要指定返回类型,Python 会根据return语句返回的值自动确定函数的返回类型。参数也不需要指定类型,同样是在函数调用时根据传入的值来确定参数的类型。而且。
2025-03-14 20:39:33
1396
原创 【洛谷DFS算法】P1088火星人
给定 1~N 的初始排列,求其第 M 个字典序后继排列(初始排列为第 1 个)。通过 DFS 回溯生成排列,首次强制使用初始排列,后续按字典序枚举,利用num计数找到目标排列,核心在于统一 0/1 下标逻辑避免边界错误,适用于 M 较小(≤100)的场景,本质是字典序排列的顺序生成与计数。【算法思路】递归终止条件◦ 首先检查 return0 标志,如果为 true,则直接返回。这是为了在找到目标排列后停止搜索。◦ 当 x == n 时,表示已经处理完了所有的位置(因为是 0 - based 索引,处理
2025-03-14 10:13:36
602
原创 【洛谷DFS算法题】组合型枚举P1036选数
这道题属于运用递归方法解决组合型枚举问题。具体而言,我们需要在完成组合型枚举的基础上,对每一种选取的组合进行求和操作,接着判断这些和是否为素数,最后输出满足和为素数这一条件的组合数量。其实,在解决该问题时,我们可以在基础的组合型枚举模板代码之上,添加一个用于判断某数是否为素数的函数,就能实现需求。【代码示例】易错分析——
2025-03-13 14:54:41
299
原创 DFS算法解决不同枚举问题+详细图解
深度优先搜索(DFS)常用于解决各种枚举问题,通常按照递归实现指数型枚举、排列型枚举、组合型枚举这三种枚举类型。
2025-03-12 10:12:55
480
原创 【洛谷DFS算法】P1123取数游戏
因此,先尝试将列坐标 y 加 1,如果 y 达到矩阵的列数 m,则表示到达当前行的末尾,需要换到下一行的第一列,即行坐标 x 加 1,列坐标 y 重置为 0。的非负整数矩阵中取出若干个数字,使得取出的任意两个数字不相邻(相邻指的是在 8 个方向相邻),并求出取出数字和的最大值。在取数字时,需要检查该位置的 8 个相邻位置是否已经取过数字,如果相邻位置都没有取过数字,则可以取该位置的数字,并标记该位置已取。:在搜索完一个位置的所有可能情况后,需要回溯,即撤销该位置的取数标记,以便尝试其他可能的取数组合。
2025-03-10 11:29:22
811
原创 DFS经典题型-P1030求先序排列
返回的迭代器并不指向字符串中的有效字符,而是指向字符串结束符之后的位置,所以不能用它来直接访问字符串的最后一个字符。迭代器可以理解为一种类似指针的对象,用于遍历容器(如字符串、数组、向量等)中的元素。①postOrder[postOrder.length() - 1] 这种写法是。,在这里就是访问字符串 postOrder 的最后一个字符。地处理左子树和右子树,从而得到先序排列。基于二叉树三种遍历方式的特点,我们可以。类的一个成员函数,它。
2025-03-08 10:36:48
237
原创 【洛谷枚举算法】P2089烤鸡
原因在于 “烤鸡” 问题是对配料组合进行枚举,每种配料的使用情况相互独立,且每个配料都必须被考虑一次,不会出现重复访问同一状态而陷入无限循环的情况。:使用二维向量 ans 来存储所有满足条件的配料组合,无需额外定义二维数组。由于每种配料的用量范围是 1 到 3 克,且有 10 种配料,我们可以使用。:用于存储输入的给定美味程度,该值决定了满足条件的配料组合。,用来记录在深度优先搜索过程中当前正在探索的配料组合情况。:常量,代表配料的种类数量,本题中固定为 10。:基于配料的种类数,本题中。
2025-03-07 18:27:25
386
原创 贪心算法解题框架+经典反例分析,效率提升300%
• 贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。它通常以自顶向下的方式进行,每一步都选择当前的最优解,而不考虑之前或之后的步骤。特点• 无后效性:即某个状态以前的过程不会影响以后的状态,只与当前状态有关。这使得贪心算法在每一步决策时,只需要考虑当前的状态信息,而不必考虑整个问题的历史信息。• 局部最优选择:贪心算法在每一步都选择当前看起来最优的决策,而不考虑整体的最优解。
2025-03-06 09:02:47
1847
原创 你的数据在「裸奔」吗?数据预处理的防翻车指南
为什么要做特征工程?在工程实践中,我们得到的数据会存在有缺失值、重复值等,在使用之前需要进行数据预处理。数据预处理没有标准的流程,通常针对不同的任务和数据集属性的不同而不同。数据预处理的常用流程为:去除唯一属性、处理缺失值、属性编码、数据标准化正则化、特征选择、主成分分析。什么是?特征工程的处理流程为首先(即相关性低的),接着去除,如共线特征,并利用存在的特征,转换特征,内容中的特征以及其他数据源生成新特征,然后对特征进行(数值化,类别转换,归一化等),最后对特征进行。
2025-03-01 22:03:14
959
原创 【洛谷贪心算法】P1090合并果子
为了使消耗的体力最小,每次都应该选择当前重量最小的两堆果子进行合并。可以使用优先队列(小根堆)来实现这个过程,优先队列可以自动维护元素的顺序,每次取出堆顶的两个元素(即最小的两个元素)进行合并,然后将合并后的结果重新插入堆中,重复这个过程直到堆中只剩下一个元素。
2025-03-01 21:44:03
451
原创 用户画像构建指南:从零开始掌握数据挖掘基础
在大数据时代,用户画像尤其重要。我们通过一些手段,给用户的习惯、行为、属性贴上一系列标签,抽象出一个用户的全貌,为广告推荐、内容分发、活动营销等诸多互联网业务提供了可能性。它是计算广告、个性化推荐、智能营销等大数据技术的基础,毫不夸张地说,用户画像是大数据业务和技术的基石。
2025-02-28 21:10:16
1477
原创 【洛谷贪心算法】P1106删数问题
具体做法是从左到右遍历数字序列,当发现当前数字比它后面的数字大时,就删除当前数字,直到删除了S个数字或者遍历完整个序列。如果遍历完后删除的数字个数还不够S个,就从序列的末尾继续删除。:是 std::string 类的一个成员函数,num.substr(start) 会返回从字符串 num 的第 start 个位置开始一直到字符串末尾的子字符串。,它本质上是字符数组,每个字符对应数字的一位,不受数值范围的限制。例如,对于一个 200 位的大整数,使用字符串可以直接将其按位存储,不会出现溢出问题。
2025-02-28 21:02:45
775
原创 【洛谷贪心算法题】P1094纪念品分组
双指针初始化:初始化两个指针 left 和 right,分别指向价格最小和最大的纪念品。该题运用贪心算法,核心思想是在每次分组时,尽可能让价格较小和较大的纪念品组合在一起,以达到最少分组的目的。输入处理:首先读取纪念品的数量n和价格上限w,然后依次读取每件纪念品的价格,并将其存储在容器vector中。,则将它们分为一组,left 指针右移一位,right 指针左移一位,分组数量加 1。,则将价格最大的纪念品单独分为一组,right 指针左移一位,分组数量加 1。输出结果:循环结束后,输出分组的数量。
2025-02-27 10:44:42
490
原创 【洛谷数据统计与查找题】P1051谁拿了最多的奖学金
虽然本题的核心是计算每个学生的奖学金,但可以使用排序算法来找出获得奖学金最多的学生。不过,这里不需要对所有学生按照奖学金金额进行完整排序,只需要在计算过程中记录下奖学金最多的学生信息即可。但如果想对所有学生按照奖学金金额从高到低排序输出,就可以使用排序算法,例如 C++ 标准库中的。:虽然本题本身不一定要使用排序算法来解决,但如果需要对所有学生按照奖学金金额进行排序输出,就会涉及到排序算法的应用。本题需要统计所有学生获得的奖学金总额,同时找出获得奖学金最多的学生。洛谷 P1051 题综合了。
2025-02-26 10:29:10
359
原创 【STL】蓝桥杯/天梯赛终极杀器!10个C++字符串核心技巧,暴力破解高频考点
函数,结合自定义比较函数实现特定排序规则。比如按字符串长度排序、按字典序逆序排序等。作为函数参数时,如果不需要修改字符串内容,尽量使用常量引用。在处理字符串计数、查找重复字符串等问题时,可使用。当需要对字符串数组进行排序时,可利用标准库的。作为哈希表,提高查找和统计效率。:已知字符串长度时,用。,减少不必要的复制开销。
2025-02-25 10:37:06
1027
原创 【洛谷排序算法】P1012拼数-详细讲解
洛谷 P1012 拼数这道题本身并非单纯考察某种经典排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)的实现,而是在排序的基础上,自定义了排序的比较规则,属于自定义排序类型的题目。不过它借助了标准库中排序算法的功能来完成排序操作,下面详细解释:
2025-02-22 22:12:16
756
原创 【爬虫】HTTP和HTTPS的请求与响应
一提起http协议,大家都会想起他是一个应用层协议,那么http协议跟爬虫有什么关系呢?在上文中我们讲到爬虫的流程,在这个流程中非常重要的一点就是我们要发送请求,发送请求就依赖于http或https协议。
2025-02-19 14:52:31
1521
1
原创 【Python】Python与C的区别(超详细总结)
C 语言C 语言函数定义有比较严格的格式。函数头包括返回类型、函数名和参数列表,参数列表中需要明确每个参数的类型。例如:函数的返回类型必须在函数定义的开头明确指定,函数体用花括号包围,函数内部通过return语句返回一个值,其类型必须与函数定义的返回类型兼容。Python 语言Python 函数定义使用def关键字。例如:不需要指定返回类型,Python 会根据return语句返回的值自动确定函数的返回类型。参数也不需要指定类型,同样是在函数调用时根据传入的值来确定参数的类型。而且。
2025-02-18 09:35:04
1006
原创 【Python】JSON
JSON是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符串JSON可以直接和Python的字典或列表进行无缝转换【主要功能】JSON就是一个在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。
2025-01-20 11:25:35
251
原创 【Python】面对对象超全总结:封装,继承,多态
使用对象组织数据:【代码示例】:类与对象类的定义python中使用class关键字来定义一个类,语法如下:在类中可以定义对象的属性和方法,属性和方法类似于前面所讲的变量和函数,但类中方法形参表的第一个参数是self,它是一个指代对象的默认参数。即在成员方法中访问成员变量,是通过参数列表中访问到的【代码示例】类中的特殊方法构造方法作用:在创建对象时对对象的属性进行初始化。每个类中都有一个构造方法,如果类中显式定义了构造方法,那么创建对象时调用的是显式定义的构造方法;否则调用默认的构造方法。init
2025-01-19 11:36:22
1177
原创 【Python】函数 超全总结及练习案例
函数:是组织好的可重复使用的,用来实现特定功能的代码段。• 将功能封装在函数内,可供随时随地重复利用• 提高代码的复用性,减少重复代码,提高开发效率# 函数的定义: def 函数名(传入参数) :函数体 return 返回值 # 函数的调用: 函数名(参数)① 参数如不需要,可以省略② 返回值如不需要,可以省略③函数必须先定义后使用lambda匿名函数函数的定义中:def关键字可以定义带有名称的函数lambda关键字可以定义匿名函数(无名称)有名称的函数,可以基于名称重复使用。
2025-01-17 11:20:10
1127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人