![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
02数据结构
acwing数据结构章节
数学系的学渣
这个作者很懒,什么都没留下…
展开
-
11哈希表
模拟散列表维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;拉链法#include <iostream>using namespace std;const int N = 1e5 + 3; // 最好取质数// 拉链法:每个下标存一组对应的值,值对应的下标根据取模N得到int h[N], e[N], ne[N], idx = 1; // h存放链表头节点,e和ne模拟链表void insert(int x) {原创 2022-01-24 14:11:56 · 387 阅读 · 0 评论 -
10堆··
堆排序输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。#include <iostream>#include <algorithm>using namespace std;const int N = 1e5 + 10;int n, m;int h[N], cnt;// 堆的下沉操作void down(int k) { // 找到k和两个子节点中的最小值 int t = k; if (k * 2 <= cnt &a原创 2022-01-24 14:03:23 · 180 阅读 · 0 评论 -
09并查集
合并集合一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中#include <iostream>using namespace std;const int N = 1e5 + 10;int n, m;int father[N]; // father[原创 2022-01-24 14:00:05 · 374 阅读 · 0 评论 -
08Trie
Trie字符串统计维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。#include <iostream>using namespace std;const int N = 1e5 + 10;// 字符串“总”长度不超过N// son[i][j]存储节点下标为i,且指向字母为j的节点下标,如果为0,说明节点不存在int s原创 2022-01-24 13:50:14 · 507 阅读 · 0 评论 -
07KMP
KMP字符串给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。KMP思路:两步:求next数组,匹配字符串next数组是求出每个p的下标能与前缀匹配的最长距离,求出那个点的下标。求法就是和自己做匹配匹配过程就是当遇到匹配不想等时,p字符串最少后退多少才能继续匹配,这个最少后退不长度就是我们next所求出的下标。#include <io原创 2021-12-05 11:11:16 · 248 阅读 · 0 评论 -
06单调队列
滑动窗口给定一个大小为 n≤106n≤10^6n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。思路:窗口用队列来存储,类似于单调栈那一题,只不过不是从右往左删除,而是从左往右删除,每次将窗口内比自己大或相等的数从左边弹出,因为窗口往右移动的过程中,最小值不可能选取比当前值还有小的数。例如:窗口 [1 3 -1] 中选最小值时应该将1,3弹出#include <iostream>原创 2021-12-05 11:02:52 · 370 阅读 · 0 评论 -
05单调栈
单调栈给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。思路:将数据构造成单调栈,因为如果下标比当前数据小,并且值比当前数大或相等的话,后面的数寻找左边比它小的数,一定不会越过当前的数,因为它更近#include <iostream>using namespace std;const int N = 1e5 + 10;int n;int s[N], top = -1;int main() { scanf("%d",原创 2021-12-05 10:53:05 · 288 阅读 · 0 评论 -
04队列·
模拟队列实现一个队列,队列初始为空,支持四种操作:push x – 向队尾插入一个数 x;pop – 从队头弹出一个数;empty – 判断队列是否为空;query – 查询队头元素。现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。这里用数组模拟队列的操作过程#include <iostream>using namespace std;const int N = 1e5 + 10;int q[N], head, tail =原创 2021-12-05 10:46:41 · 579 阅读 · 0 评论 -
03栈··
模拟栈实现一个栈,栈初始为空,支持四种操作:push x – 向栈顶插入一个数 x;pop – 从栈顶弹出一个数;empty – 判断栈是否为空;query – 查询栈顶元素。现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。下面用数组模拟这个过程#include <iostream>using namespace std;const int N = 1e5 + 10;int s[N], top = -1;void push(原创 2021-12-05 10:43:14 · 486 阅读 · 0 评论 -
02双链表
双链表实现一个双链表,双链表初始为空,支持 5 种操作:在最左侧插入一个数;在最右侧插入一个数;将第 k 个插入的数删除;在第 k 个插入的数左侧插入一个数;在第 k 个插入的数右侧插入一个数现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。思路用三个数组模拟双链表操作,e存储值,l存储指向左边的下标(指针),r存储指向右边的下标。#include <iostream>using namespace std;const int N =原创 2021-12-01 09:42:11 · 640 阅读 · 0 评论 -
01单链表
单链表实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。思路数组模拟链表操作#include <iostream>using namespace std;const int N = 1e5 + 10;// e存储值,ne存储下一个值的下标,idx为当前待分配的空间下标,head为头节点int e[N],原创 2021-12-01 09:35:51 · 237 阅读 · 0 评论