算法与数据结构
文章平均质量分 66
各类算法和数据结构,题解
爱学习的图灵机
计算机新生努力学习
展开
-
【算法竞赛进阶指南】141.周期 题解 KMP 最小循环节
可以从几乎任意位置开始,只要字符串的长度足够长以支持所描述的周期 (如果不支持,那么表示从j开始的后续部分无法使用T’进行重复构成,这样的情况则不需要讨论。上面的1就是下面的1(完全相同的部分),而下面的1等于上面的2(前后缀匹配),上面的2等于下面的2,而下面的2等于上面的3…反证: 假设原串存在一个子串T’,它不是最短循环节,也不是最短循环节的循环构成(倍数),但是可以循环构成原串。所以假设是错误的,也就是说,T确实是最短循环节。所以上面的1,2,3,4,5和下面的1,2,3,4,5完全相同。原创 2023-05-30 16:36:32 · 898 阅读 · 0 评论 -
后缀树组 哈希+二分做法
后缀数组题目:用哈希和二分构建后缀数组。原创 2023-05-10 17:51:07 · 556 阅读 · 0 评论 -
回文子串的最大长度 nlogn
回文子串模板题,使用字符串哈希和二分,达到更优的O(nlogn)原创 2023-05-10 17:39:41 · 792 阅读 · 0 评论 -
递归实现组合型枚举 最快速度
【代码】递归实现组合型枚举 最快速度。原创 2023-04-05 09:58:02 · 69 阅读 · 0 评论 -
C++手写stack容易犯的错误
【代码】C++手写stack容易犯的错误。原创 2023-04-05 09:55:40 · 118 阅读 · 0 评论 -
assert Debug技巧
如果条件表达式结果为0或false则程序中断,并且报错信息中告诉你哪一行出错。原创 2023-04-05 09:54:50 · 92 阅读 · 0 评论 -
快读快写模板 (缓冲区)
快读快写:在一些算法题中输入输出的数据可能达到10^7的范围,此时用scanf和printf的时间将大大超过一秒,此时需要使用快速读入和快速输出的方法(下文简称快读快写)。即使输入输出数据量中等,使用快读和快写也可以延长程序的计算时间,如果写的是暴力算法就可能能过更多的点。原创 2023-01-16 19:56:16 · 427 阅读 · 0 评论 -
【基数排序】 C++高效实现
网上搜索基数排序C++,大多都是非常低效的实现,于是自己动手实现一个速度较快的版本。进制下,每次取个位和十位需要用除法和模运算,为了规避除法和模运算,采用。数据快排需要850ms,而本文章给出的基数排序只需要180ms。注意提前在文件夹下建立in.txt与out.txt。请你使用快速排序对这个数列按照从小到大进行排序。实际测试比快速排序略快(数据量。并将排好序的数列按顺序输出。输入共两行,第一行包含整数。个整数,表示排好序的数列。范围内),表示整个数列。个整数(所有整数均在。基数排序原理:一图胜千言。原创 2023-01-13 23:01:30 · 631 阅读 · 0 评论 -
【Leetcode】440. 字典序的第K小数字 题解 详细描述 C++
440. 字典序的第K小数字 - 力扣(LeetCode) (leetcode-cn.com)思路构建数字字典树:可以在nnn的范围内建出这个字典树。找K小数,考虑朴素算法:深搜从上到下,从左到右,一个一个搜,搜KKK次找到的就是KKK小数。如n=109,k=103n = 109,k = 103n=109,k=103, 那么找到路线就是1-10-100-101-102-103。这个做法复杂度显然是O(K)O(K)O(K)的,数据范围在1e91e91e9会超时,所以考虑优化:由于该树除了包含nnn原创 2022-03-23 20:27:03 · 1764 阅读 · 0 评论 -
【线段树】基础原理图解,建树,应用
线段树建树方式将一个区间每次分半,作为节点,连接成树。注意将l+r>>1l + r >> 1l+r>>1节点划分到左子节点,也就是奇数长度区间的中点划分到左子节点。这个除了最后一层是满二叉树,故用类似堆的形式存储,也就是关于堆详细请看手写堆/交换堆。注意2x=x<<1,2x+1=x<<1∣12x = x << 1,2x + 1 = x << 1 | 12x=x<<1,2x+1=x<<1∣1原创 2022-03-14 23:38:05 · 325 阅读 · 0 评论 -
差分约束原理 例题:区间
差分约束是用最短路算法解决两种问题1.求不等式组可行解2.求可行解中所有解最大值或最小值2.有两种意思,总共的最值和单个解的最值。在差分约数问题中单个最优就能导出全局最优,下面会证明。差分约束能解决如下形如下方的不等式组形式全部都是xi <= xj + ck的形式(或 >=)对于一个已经计算好最短路的图,满足三角不等式,如下有对应关系建立变量和点的对应关系,到一个点的最短距离就是一个变量的可行解。求不等式组可行解需要满足条件 :源点要满足从源点出发,一定可以走到到所有的边 (原创 2022-02-27 16:39:27 · 275 阅读 · 0 评论 -
01分数规划 观光奶牛
01分数规划的题目通常长这样本质上是在求∑fi∑ti\frac{\sum{f_i}}{\sum{t_i}}∑ti∑fi的最大值,这类分数求最大、最小的问题被成为01分数规划问题。01分数规划求最大值通常使用二分,二分的范围要看题目,对于本题 ∑环点权∑环边权\frac{\sum{环点权}}{\sum{环边权}}∑环边权∑环点权 的范围为(0,1000](0, 1000](0,1000]于是问题可以转化 $\frac{\sum{f_i}}{\sum{t_i}},,\overset{?}{&g原创 2022-02-27 15:49:42 · 151 阅读 · 0 评论 -
spfa判负环
spfa 判负环基于抽屉原理,如果一条正在搜索的最短路径上的点的个数大于总共点的个数,则说明路径上一定有至少重复的两个点,走了回头路。又因为满足最短路径的性质,所以一定存在负环。可以处理负权边的最短路算法就可以找环。通常用spfa,记录每个点的cnt,当cnt >= 点的个数说明有负环。一个不稳定优化:仅仅找负环时,将spfa用的队列换成栈可能会加速。因为用栈的spfa搜索类似于深搜,在环上更容易一次把环跑完,所以更容易搜到负环。另,找负环不需要初始化dist数组,因为只要有负环,某个点的距原创 2022-02-27 15:15:36 · 498 阅读 · 1 评论 -
次小生成树问题——秘密的牛奶运输
题目描述算法本题是一个裸的严格次小生成树问题。所谓严格就是该次小生成树的总边权严格大于最小生成树(以下用MGT称呼)。非严格的就是边权和MGT相同算法1:自然的想先求MGT,再每次删去MGT中的一条边,在该图上做MGT求解(新图的MGT就是原图的次小生成树)。做一遍kruskal后面就不用再排序了,删边次数n - 1,每次求MGT是m,故 O(mlogm+nm)O(mlogm + nm)O(mlogm+nm)。这种方法求不出 严格次小生成树,因为如果有非严格次小生成树,删边之后再找肯定会找到非原创 2022-02-19 22:33:39 · 558 阅读 · 0 评论 -
最大异或和——广义前缀和的应用 Trie树
最大异或和给定一个非负整数数列 a,初始长度为 N。请在所有长度不超过 M 的连续子数组中,找出子数组异或和的最大值。子数组的异或和即为子数组中所有元素按位异或得到的结果。注意:子数组可以为空。输入格式第一行包含两个整数 N,M。第二行包含 N 个整数,其中第 i 个为 ai。输出格式输出可以得到的子数组异或和的最大值。数据范围对于 20% 的数据,1≤M≤N≤100对于 50% 的数据,1≤M≤N≤1000对于 100% 的数据,1≤M≤N≤105,0≤ai≤231−1输入样原创 2022-01-31 20:05:07 · 2166 阅读 · 0 评论 -
两个常用最小生成树算法
Kruskal思路对边从小到大排序,使用并查集逐个连接边所对应的两个点,如果还不在集合里就连接,在集合里就不需要再次连了,最后并查集里的点就对应最小生成树的点。正确性最小生成树里有最小边权覆盖所有点的边,由于我们连接时按照从小到大的顺序相连,那么两个点连接的一定是最短的那条边,所以就是最小生成树代码/* * @Author: ACCXavier * @Date: 2021-05-13 21:43:18 * @LastEditTime: 2021-05-13 22:14:27 * Bili原创 2021-06-27 10:31:57 · 134 阅读 · 0 评论 -
FHQ Treap 详解
0.简单介绍FHQ Treap,以下简写为fhq,是一种treap(树堆)的变体,功能比treap强大,代码比splay好写,易于理解,常数稍大.fhq不需要通过一般平衡树的左右旋转来保持平衡,而是通过分裂(split)和合并(merge)来实现操作.本文力求简明易懂,在看本文前最好先了解过一种平衡树的基本写法,否则代码部分有可能看不懂.1. 基本操作结构以结构体作为树的每一个节点,存储左子树和右子树的位置,权值,堆权值,和子树大小.struct Node { int l, r;原创 2021-06-21 10:47:35 · 5068 阅读 · 7 评论 -
HDU 1236 排序
Problem Description今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的 考生,并将他们的成绩按降序打印。Input测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 <...原创 2020-04-19 18:41:45 · 175 阅读 · 0 评论 -
6-4链式表的按序号查找 (10分)
链式表的按序号查找 (10分)本题要求实现一个函数,找到并返回链式表的第K个元素。函数接口定义:ElementType FindKth( List L, int K );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};ty...原创 2020-04-14 23:40:48 · 854 阅读 · 0 评论 -
6-3 求链式表的表长 (10分)
6-3 求链式表的表长 (10分)本题要求实现一个函数,求链式表的表长。函数接口定义:int Length( List L );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};typedef PtrToLNode List...原创 2020-04-14 23:33:19 · 480 阅读 · 0 评论 -
程序设计与算法(二)第一周习题解答 OpenJudge
001:特殊密码锁总时间限制: 1000ms 内存限制: 1024kB描述有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。输入两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态原创 2020-10-08 09:57:12 · 311 阅读 · 0 评论 -
十六进制转八进制 10万位输入数据
问题描述给定n个十六进制正整数,输出它们对应的八进制数。输入格式输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9,大写字母A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式输出n行,每行为输入对应的八进制正整数。题目分析:注意到输入数据巨大(100000),不能直接使用系统类型进行存储转换。我们考虑先将16进制转2进制,然后将2进制转8进制。16进制转2进制是每个数字或字母对应4个2进制原创 2020-10-06 09:26:08 · 314 阅读 · 0 评论 -
熄灯问题 //北大郭炜老师代码//大量注释 //EXTENDED LIGHTS OUT
1222:EXTENDED LIGHTS OUT查看提交统计提示提问总时间限制: 1000ms 内存限制: 65536kB描述In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a button is pressed,原创 2020-09-25 15:44:11 · 263 阅读 · 1 评论 -
快速判断栈的正确输出序列
一句话,先入后出必逆序,违反这个规则的都是错误序列。例一:设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合法输出序列的是( )。A 5 1 2 3 4B 4 5 1 3 2C 4 3 1 2 5D 3 2 1 5 4分析:A 1234 比5先入 后出但没有逆序 错误B 123比45先入 后出没有逆序 变成了132 错误C 12先入 后出没有逆序 错误...原创 2020-04-02 09:56:05 · 2880 阅读 · 2 评论 -
PTA 陈越 数据结构习题 6-1 单链表逆转 (20分)
浙大PTA 数据结构习题 6-1 单链表逆转 (20分)本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node PtrToNode;struct Node {ElementType Data; / 存储结点数据 /PtrToNode Next; / 指向下一个结点的指...原创 2020-03-03 16:37:15 · 3764 阅读 · 0 评论 -
数论算法_线性筛_原理解释及其C++实现
线性筛在O(n)O(n)O(n)]时间内得到素数表的一种算法实现原理:用int primes[]记录素数,st[i]记录i是否为素数每一个数字只会被最小质因子筛掉,对于n而言最小质因子一定出现在⩽n\leqslant \sqrt{\mathrm{n}}⩽n的范围内可以用均摊分析的方法来分析算法的复杂度,由于每个合数都唯一的被它的最小素因子筛一次,而每个合数的最小素因子都是唯一的,总复杂度是O(n)O(n)O(n)注意,每次筛的都是primes[j]*i代码:#include <b原创 2021-06-14 16:31:07 · 243 阅读 · 0 评论 -
链表/栈/队列/单调栈/单调队列
链表以下链表均由数组模拟单链表基本操作:(对k结点)![image.png](https://img-blog.csdnimg.cn/img_convert/bdb3292e121a4c4b59eba10b15599d48.png#align=left&display=inline&height=202&margin=[object Object]&name=image.png&originHeight=271&originWidth=534&.原创 2021-04-15 00:38:48 · 132 阅读 · 0 评论 -
01背包/完全背包/多重背包-优化/分组背包整理
01背包f[i,j]表示前i件物品,体积不超过j的最大价值每件物品一个转移方程由于i状态转移只用到f[i-1],故优化掉第一维,具体来说计算f[j]的时候要有上层f[j-v],由于去掉第一维度后本身就是上一层的值,所以需要逆序遍历,保证j-v是上层的j-v./* * @Author: ACCXavier * @Date: 2021-04-25 19:57:50 * @LastEditTime: 2021-05-24 11:54:01 * Bilibili:https://space.bi原创 2021-05-24 12:38:07 · 161 阅读 · 0 评论 -
最长上升子序列nlogn写法
思路和方法普通做法最长上升子序列dp求法:f[i] = max(f[k]+1,f[i]),此时f[i]表示以i结尾的上升子序列的最大长度优化做法现在考虑长度为1的子序列,3和1如果后续子序列能接到3的后面则一定能接到1的后面,故3这个子序列就不用存,因为能接在3后面一定能接在1后面,故对于长度1的子序列只需要存结尾值最小的.以此类推所有长度的子序列只需要存结尾长度最小的即可.我们存f[i]表示长度为i的上升子序列的结尾最小值,该数组一定单调上升 (1)当要更新以a[i]结尾的子序列的长度,需要原创 2021-05-24 11:40:54 · 386 阅读 · 0 评论 -
力扣664.奇怪的打印机题解
题目地址有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印由 同一个字符 组成的序列。 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。 给你一个字符串 s,你的任务是计算这个打印机打印它需要的最少打印次数。示例 1:输入:s = “aaabbb” 输出:2 解释:首先打印 “aaa” 然后打印 “bbb”。 示例 2:输入:s = “aba” 输出:2 解释:首先打印 “aaa” 然后在第二个位置打印 “b” 覆盖掉原来的字符 ‘a’。提示:1 <= s.l.原创 2021-05-24 09:15:54 · 239 阅读 · 0 评论 -
手写堆/交换堆
堆堆是一颗完全二叉树,除了最底层之外其他层结点都是满的.这里我们取小根堆,有如下性质:1.若k为某结点编号,其父结点编号为k/2,左子节点2k,右子节点2k+12.堆结点A若有子节点,则A的值小于(两个)子节点的值(若是大根堆就变成大于),两个子节点的值的大小不管3.堆顶一定为堆中最小值(性质2的推论)4.堆底层存满时时第二层元素为n/4个堆的存储:int heap[N], idx;由于堆是一颗完全二叉树故可正好占满一个序列的位置,所以用数组存,idx代表用到点的个数.一般点要从1开始用原创 2021-05-11 10:28:02 · 202 阅读 · 0 评论 -
数据结构 链表
链表以下链表均由数组模拟单链表基本操作:(对k结点)![image.png](https://img-blog.csdnimg.cn/img_convert/bdb3292e121a4c4b59eba10b15599d48.png#align=left&display=inline&height=202&margin=[object Object]&name=image.png&originHeight=271&originWidth=534&原创 2021-04-22 00:57:15 · 150 阅读 · 0 评论 -
让AI玩俄罗斯方块 UCL ENGF2 CA4.1 作业
作业内容你的代码应该放在player.py中。player是一个class,它具有一个名为chooseaction的函数。这个函数会在每次玩家需要一个动作时调用。你所写的选择动作函数应该根据棋盘的状态来决定采取什么行动。•board.falling包含有关当前下落块的信息;最重要的是,它的形状(board.falling.shape)和单元格的坐标(board.falling.cells)。这个形状是enumshape的一个实例(instance),它的定义可以在board.py中找到。•boa原创 2020-11-24 15:02:51 · 551 阅读 · 0 评论