
数据结构
数据结构
墨染&殇泪
这个作者很懒,什么都没留下…
展开
-
acwing算法基础课:C++ STL
C++ STL简介原创 2021-10-06 19:24:30 · 259 阅读 · 0 评论 -
acwing算法基础课:哈希表
一般哈希表模板(1) 拉链法 int h[N], e[N], ne[N], idx; // 向哈希表中插入一个数 void insert(int x) { int k = (x % N + N) % N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++ ; } // 在哈希表中查询某个数是否存在 bool find(int x) {原创 2021-09-27 12:59:30 · 269 阅读 · 0 评论 -
acwing算法基础课:单调栈
单调栈模版常见模型:找出每个数左边离它最近的比它大/小的数int tt = 0;for (int i = 1; i <= n; i ++ ){ while (tt && check(stk[tt], i)) tt -- ; stk[ ++ tt] = i;}例题给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。#include <iostream>using namespace std;const i原创 2021-09-05 11:29:24 · 123 阅读 · 0 评论 -
acwing算法基础课:Trie树
Trie树模板int son[N][26], cnt[N], idx;// 0号点既是根节点,又是空节点// son[][]存储树中每个节点的子节点// cnt[]存储以每个节点结尾的单词数量// 插入一个字符串void insert(char *str){ int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) son[p][u原创 2021-09-13 18:33:32 · 174 阅读 · 0 评论 -
acwing算法基础课:堆
堆模板堆是一个完全二叉树,左右节点都小于父节点// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1// ph[k]存储第k个插入的点在堆中的位置// hp[k]存储堆中下标是k的点是第几个插入的int h[N], ph[N], hp[N], size;// 交换两个点,及其映射关系void heap_swap(int a, int b){ swap(ph[hp[a]],ph[hp[b]]); swap(hp[a], hp[b]);原创 2021-09-26 21:12:16 · 138 阅读 · 0 评论 -
acwing算法基础课:kmp
KMP 模板// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度求模式串的Next数组:for (int i = 2, j = 0; i <= m; i ++ ){ while (j && p[i] != p[j + 1]) j = ne[j]; if (p[i] == p[j + 1]) j ++ ; ne[i] = j;}// 匹配for (int i = 1, j = 0; i <= n; i ++ ){ whi原创 2021-09-05 19:58:56 · 219 阅读 · 0 评论 -
acwing算法基础课:单调队列
单调队列模版常见模型:找出滑动窗口中的最大值/最小值int hh = 0, tt = -1;for (int i = 0; i < n; i ++ ){ while (hh <= tt && check_out(q[hh])) hh ++ ; // 判断队头是否滑出窗口 while (hh <= tt && check(q[tt], i)) tt -- ; q[ ++ tt] = i;}例题滑动窗口,给一个数组和大小原创 2021-09-05 17:37:37 · 138 阅读 · 0 评论 -
acwing算法基础课:并查集
并查集模板作用:1.将两个集合合并2.询问两个元素是否在同一个集合中近乎O(1)时间复杂度完成上述操作基本原理:每个集合用一棵树表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点(1)朴素并查集: int p[N]; //存储每个点的祖宗节点 // 返回x的祖宗节点 int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x];原创 2021-09-13 21:02:41 · 191 阅读 · 0 评论 -
acwing算法基础课:模拟栈和模拟队列
模拟栈// tt表示栈顶int stk[N], tt = 0;// 向栈顶插入一个数stk[ ++ tt] = x;// 从栈顶弹出一个数tt -- ;// 栈顶的值stk[tt];// 判断栈是否为空if (tt > 0){}模拟普通队列// hh 表示队头,tt表示队尾int q[N], hh = 0, tt = -1;// 向队尾插入一个数q[ ++ tt] = x;// 从队头弹出一个数hh ++ ;// 队头的值q[hh];//原创 2021-09-05 11:05:50 · 109 阅读 · 0 评论 -
acwing算法基础课:单链表和双链表
单链表模板// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head = idx ++ ;}// 将头结点删除,需要保证头结点存在void remo原创 2021-09-04 22:38:52 · 264 阅读 · 1 评论