- 博客(41)
- 收藏
- 关注
原创 现代密码学总结(下篇)
密钥管理与公钥变革Needham-Schroeder协议(对称)1978年提出, 非安全网络环境下, 借助可信第三方利用对称密码技术分配会话密钥假设A和B分别与信任权威T建立了一个共享的静态密钥Kat和KbtDiffie-Hellman (-Merkle) KE 协议安全定义:如果DDH问题对于群 G 是困难的,那么DiffieHellman密钥交换协议在窃听者存在的情况下是安全的中间人攻击公钥加密发送方使用公钥对消息进行加密;接收方使用私钥解密生成的密文。优势:公钥
2024-12-14 20:36:09
1006
原创 现代密码学总结(上篇)
现代密码学总结(v.1.0.0版本)之后会更新内容基本说明:∙\bullet∙如果AAA是随机算法,y←A(x)y\leftarrow A(x)y←A(x)表示输入为xxx ,通过均匀选择的随机带运行AAA,并且将输出赋给yyy。∙\bullet∙如果SSS是个集合,则x←Sx\leftarrow Sx←S表示xxx是从SSS中均匀随机选择的。∙\bullet∙ {0,1}n\{ 0, 1\} ^n{0,1}n表示的是所有长度为nnn的比特串的集合。∙\bullet∙ {0,1}≤n\{ 0
2024-12-14 20:34:45
757
原创 算法题常用的STL(Java与C++)(90%)
/if a>b 则交换,so这是递增序列。是一个先进先出(FIFO)的数据结构,它通过接口来实现,常用的实现类有。是一个后进先出(LIFO)的数据结构,它是通过扩展。
2024-08-30 22:09:31
637
1
原创 二分&三分+例题
注:这里使用 1e10-8,是因为题目要求保留小数点后6位,如果使用1e10-7, 那么这个因为四舍五入第八位到第七位,已经产生误差,输出六位时候误差会积累。问题描述:主人过生日,m个人来庆生,有n块半径不同的圆形蛋糕,由m十1个人 (加上主人)分,要求每人的蛋糕必须一样重,而且是一整块(不能是几个蛋糕碎块,也就是说,每个人的蛋糕都是从一块圆蛋糕中切下来的完整一块)。c.函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则真,若查找不到则返回值为假。
2024-08-26 18:06:10
467
原创 动态规划类型题目汇总及解析(持续更新)
Leetcode 1049. 最后一块石头的重量 IIpublic:int dp[N];int res=0;i++){j--){
2024-08-24 20:57:18
1065
原创 数据结构:线段树
线段树的节点tree[i]记录了区间i的值,那么可以再定义一个tag[i],用它统一记录区间i的修改,而不是一个个地修改区间内的每个元素,这个方法称为Lazy-Tag(懒惰标记或延迟标记)。区间修改时给p打了tag标记,接下来就把tag[p]传给左右子树,然后把tag[p]清零。使用Lazy-Tag方法时,若修改的是一个线段区间,就只对这个线段区间进行整体上的。修改,其内部每个元素的内容先不做修改,只有当这个线段区间的一致性被破坏时,才把变。区间i的Lazy操作,用tag[i]记录。
2024-07-20 21:43:30
930
原创 数据结构:树状数组
原理:我们发现,除了最后一个1,以及其后面的0,其余位置都是反,则要求最后一位1的位置,可以将原码和补码按位&;而计算机中-x有取补码,则lowbit(x)=x&-x;例子:数组:1,2,3,4,5,6,71.如果想要修改6=0110,
2024-07-11 18:56:11
1385
1
原创 绝对值不等式运用(货仓选址)+耍杂技的牛(推公式)(C++)
如下图所示:到A,B两点,利用反证法可知:只有在A,B之间的点到A,B距离最短(即下图黄色框选区域)奇数个时候,取中位数刚合适(取紫色区域中间);偶数取到中间两个数直接就可以。为啥能直接写:因为不论奇数偶数,取到q[n/2]即可,编译器会自动取整。根据数学表达式,我们发现的确满足取等条件,则说明正确。
2024-07-11 00:24:28
399
原创 二分图(染色法与匈牙利算法)
在上述代码中,有一个令人费解的东西:就是st数组的作用,其实直白的理解:如果你每次不把st重新置为false,那剩下的人一看到前面的妹子st已经为true,不去让妹子的对象换掉这个妹子,直接就放弃了,会影响最后结果。不难看出,st数组主要是在两个人连接了一个妹子的的时候才有用, 这个st的存在,让find在本次找的时候,原来的那个男生,不会再找这个妹子,只会找其他的。注意:如果有三个点另外成环,整个环是一个孤立环,其他都满足二分图,但是这个孤立不满足二分图,二分图的点不一定连通。让该男生考虑所有心动女生。
2024-05-08 09:32:37
1040
原创 最小生成树(Prim&Kruskal算法)
定义:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。通俗的来讲:给定一个无向图,在图中选择若干条边把图的所有节点连起来。要求边长之和最小。在图论中,叫做求最小生成树。如果要求一个图的最小生成树,可以用prim和kruskal算法。
2024-05-07 20:13:30
519
原创 (图论)最短路问题合集(C++)
原题:思路:(依然是贪心的思想)1.初始化距离:dis[1]=0,dis[i]=INF(正无穷)2.循环n次:找到当前不在s中的dis最小的点(s表示已经确定最短距离的点(可以开一个st数组表示))假设找到了t这个点,用这个点更新其他所有点的最短距离:if dis[x]>dis[t]+wi(这里wi表示边权)实例演示:代码如下:一些注意细节(用//表示)这里储存方式用邻接矩阵,主要是因为用于稠密图。图中可能存在重边和自环,。
2024-05-05 19:07:20
1894
2
原创 并查集(带权)应用:食物链
((d[x] - d[y] + 3) % 3)) 就可以判断呢?为什么,if (rootx == rooty){3.merge(合并的同时检查一下关系)2.find(带路径压缩)
2024-04-06 11:05:50
367
原创 二叉树+哈夫曼树(详解)
题目简述:就是输入字符串,对每个字符串操作如下:然后分别用ASCII编码(每个字符为8位)和哈夫曼编码,输出ASCII码的长度和哈夫曼编码的长度,求出压缩比(保留1为小数,即使ASCII/哈夫曼),直到输入字符串END才结束。根据上面的论述,我们可以用优先队列去解决这个问题(因为要知道每个字符的多少,涉及到排序)问题:为什么 q.push(a+b);ans += a+b;
2024-03-31 20:03:29
218
原创 队列(模拟+stl)+例题(双端队列,单调队列)
队尾元素3比-1大,那么意味着只要-1进队,那么3在其有生之年必定成为不了最小值,原因很明显:因为当下面3被框起来,那么-1也一定被框起来,所以3永远不能当最小值。3先与队尾的5比较,3-3,-1从队尾出队,-3从队尾进队。此时,q={3,6,7},p={6,7,8}。同理,1从队尾出队。
2024-03-31 14:11:44
950
2
原创 字符串哈希操作(字符串操作中相当好用)
3.MOD Q对于自然溢出方法,可以利用 unsigned long long 整数的自然溢出,去代替mod 2^64-1。我们搜索子串通常想到kmp算法,但是这里如果用kmp感觉有点麻烦。于是我们引入一种新的方法,可以帮助我们快速判断字符串。2. 冲突问题:通过巧妙设置P (131 或 13331) ,Q=2^64,的值,一般可以理解为不产生冲突。1. 任意字符不可以映射成0,否则会出现不同的字符串都映射成0的情况,比如A,AA,AAA皆为0。1.p有次幂,我们先用p【】储存好数据,便于计算。
2024-03-12 19:49:52
348
1
原创 模拟堆排序
然后后面的操作就是每次取出堆顶元素,然后把堆尾元素放到堆顶,然后再取出堆顶元素,然后再循环操作,直到取完所有的元素。2,删除最小值 删除h[1],然后让最后一个元素赋值到h[1]的位置;4,删除一个数字 让删除元素的位置赋值最后一个元素,然后进行up,down(这个无所谓,自动执行)但上述5种操作,也可以简化为up()与down()的结合都可以实现。3,插入一个数字 在堆尾插入,cnt++;5,修改一个数字 修改元素的值,然后进行up,down。代码如下:有数组h[];
2024-03-11 20:09:49
399
原创 并查集应用:连通块中点的数量
于是,我们发现,只需要在初始化对每一个集合size赋值为1,之后,每一次链接,都将连接后根节点cnt增加,增加多少:(假设将a连接到b上)cnt(b)=cnt(b)+cnt(a);其实操作也很简单,我们只需要增加一cnt的数组,记录个数。这里记录的永远是根节点所带领的集合中的1元素,只有根节点才是有效的。
2024-03-10 23:35:57
194
1
原创 并查集应用:合并集合(内附有连通块中点的数量&食物链等相关题目的链接)
是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。我们的在并查集关注重点是在关注两个人是否连通,因此他们具体是如何连通的,内部结构是怎样的,甚至根节点是哪个都不重要。所以并查集,主要用于处理一些不相交集合(disjoint sets)的合并及查询问题。例如:有一个集合{0,12,3324,2},和另一个集合{2,34,3,12}判断12和0是否在同一个集合中的时候,那么我们就可以使用并查集。
2024-03-10 22:46:30
438
1
原创 Trie(字典树)应用:对字符串进行统计&&求最大异或对&&Leetcode 648.单词替换
优点:字典树中实际上记录了多个字符串的公共前缀,因此用于查询公共前缀时是十分高效的,他减少了无意义的字符串匹配,其查询效率要优于哈希树。3、每个单词结束的时候用一个特殊字符表示,那么从根节点到任意一个特殊字符,所经过的边的所有字母表示一个单词。那么假设我们要查找字符串:sdg,我们从头结点开始遍历,然后走到结尾,发现了标识,说明存在这么一组字符串。共有 N个操作,所有输入的字符串总长度不超过 105105,字符串仅包含小写英文字母。缺点:字典树的内存消耗非常大,字典树的核心思想是用空间来换时间。
2024-03-10 14:38:22
485
1
原创 kmp算法(图解)
我们在每次失配时,不是把p串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。其实原理和刚刚差不多:只不过刚刚是s,p,这里换成p,p,并且i的位置从2开始(不是比较相同的位置,而是比较前后缀是否相同)注意:这里是p[i]与p[j+1]的比较。假设现在有如下的s,p,以及next数组(先不管这个,就假设它已经是给定的条件),next[i] 就是所求最长相等前后缀中前缀的最后一位的下标。就是,一个字符一个字符比对,比对失败,跳回开头,再接着下一个字符继续比对。
2024-03-10 12:08:11
431
1
原创 单调栈(思路)
我们先来看暴力思路:就是两层循环,第一层从第一个数字开始遍历,第二层循环就是从当前数开始向左遍历,直到找到比它小的数字,如果没有返回-1.假设现在数据逐个放入一个栈中,也就是在发现xn[y]时候,将n[x]弹出。给定一个长度为 n 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出−1。当xn[y]的时候,n[x]可以不在后面存在。弹出条件:当栈不为空,前一个元素比后一个元素大的时候。先来看一组动图(来源:Hasity)很明显,这种算法相当耗费时间。
2024-02-28 22:14:47
235
原创 快速排序(思路)
2.递归实现:分为左边和右边,由于左边是小于x,右边是大于x,则不需要合并,最后得到的数组就是排列好的。1.实现分区:退出条件:l>=r。
2024-02-27 18:25:16
245
原创 素数筛—朴素筛,埃氏筛,线性筛(详细)
我们 从上面的过程来看,我们发现筛去2的倍数后,后面筛去4,6,8等的倍数,出现了重复,同样,6筛去的3也筛去了。所以,我们发现,只需要筛去质数2,3,5,7...的倍数,就可以达到筛出所以质数的目的。(因为i % primes[j] == 0),此时primes[j+1]*i%primes[j]也一定为0;过程:从2开始,删去2的倍数;从3开始,删去3的倍数;朴素筛就是从2开始一直到n,删去所有的倍数,留下的数就是质数。代码如下:(题目:求从2到n中素数的个数)1.primes中存的质数,是升序排列的。
2024-02-04 18:45:02
449
1
原创 排序4——堆排序
int tmp;break;return;heapsize--;printf("排序前:\n");i < 9;i++)printf("排序后:\n");i < 9;i++)END。
2023-11-11 12:27:24
183
1
原创 单链表基础实现+单双链表数组模拟+STL使用+习题练习(超详解)
链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成 (malloc),每个节点包括两个部分:一个是存储数据元素的数据域data另一个是存储下一个节点地址的指针域next*
2023-11-04 22:22:38
310
1
原创 排序3——归并排序
便是:已经有两个各自排好序的数组,我们从他们第一个数据开始比较,如果左第一个比右第一个小,那么我们直接给temp数组的第一个元素赋值左边第一个数,然后做比左边数组移动到下一位,如果等于或者大于右边的话,则把右边的赋值给temp,最后temp移动一位。将子数组分到其中只有一个元素,此时我们就可以认为这个子数组是有序的,然后在得到左右两个这样只有一个元素的子数组后进入归并merge,得到一个更大的有序数组如圈1时的数组,其他子数组和这个过程相同,直至将所有其全部归并我们就会得到一个有序数组。
2023-11-02 22:23:24
114
2
原创 递归详解+汉诺塔&斐波那契&归并排序实例(亲身感悟)
Q:为啥是a,c,b,因为我们要把a移动到b,而我们这里的函数(如最上面的题),c是我们要把a上的圆盘,放到的那根柱子,所以我们要把a->b,所以我们要把循序改为:a,c,b。这里就是运用了分而治之的思想,我们要求n=3时候的汉诺塔,我们可以先求n=2时候的汉诺塔,也就是把3个上面的2个合并成一个整体,然后我们就继续上面的操作就可以。,我们的目标就是求解n*(n-1)!县令:(心算f(1)=f(0)*1=1)回知府大人,f(1)=1。知府:(心算f(2)=f(1)*2=2)回大人,f(2)=2。
2023-11-02 20:51:34
109
1
原创 2排序——插入排序(详细)
他的想法是把j和后面每一个都比较一遍,然后找到那个比它小的数,和这个数前面的数交换。这样显然是有问题的,因为交换的时候,arr[j],可能已经做了交换,不再是原来的那个j。2.实际演示,注:每一次比较之后都会更换位置,直到触发结束机制。END,持续更新数据结构与算法。
2023-11-01 21:45:44
82
1
原创 排序1——冒泡排序(详解)
我们发现,如果数组是1,2,3,4,5或者我们比较到一半,发现这个数组已经完成了排序,这时候我们想要结束排序,所以我们引入一个flag做标记。每次循环之后,都做一次判断,如果在整个过程中我们没有进行任何一次操作,说明我们的数组已经是有序的了,这时候,我们不需要再排序了。1我们要将它排序:先看数组中第一个与第二个元素:5,7。5比7小,所以7仍然在右侧不变。1.2.继续看:7,4。发现7比4大,所以7与4调换位置。2.1继续看第一个与第二个元素,发现5比4大,交换5和4.2.2 5和7比较,不变。
2023-11-01 20:50:31
96
1
原创 c-prime函数搞定素数
该函数接受一个整数n作为参数,如果n为质数,则返回1,否则返回0。算法的核心是从2到sqrt(n)遍历所有可能的因子,如果找到了一个能够整除n的因子,则n不是质数。C语言中的prime()函数通常用于判断一个数是否为质数。
2023-10-10 17:56:07
3571
1
大一C++满分项目-职工管理系统(内附源码(vs studio),ppt,已完成的报告)
2024-07-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人