![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 59
AcWing数据结构专栏
奋斗吧!骚年!
一名爱健身的软件工程本科生
展开
-
数据结构:字符串哈希—哈希表
C++字符串哈希模板:理解:把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。题目: AcWing 841. 字符串哈希给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数 n 和 m,表示字符串长度和询问次数。第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。接下来原创 2022-06-01 20:55:32 · 372 阅读 · 0 评论 -
数据结构:食物链—并查集
题目: AcWing 240. 食物链动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:第一种说法是 1 X Y,表示 X 和 Y 是同类。第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是原创 2022-05-28 23:47:09 · 130 阅读 · 0 评论 -
数据结构:KMP字符串—KMP
C++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 ++ ){原创 2022-05-28 20:20:48 · 79 阅读 · 0 评论 -
数据结构:最大异或对—Trie
题目: AcWing 143. 最大异或对在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231输入样例:31 2 3输出样例:3题目分析:xor(异或就是^运算)1^1=1, 1^0=1 ,0^1=1, 0^0=0所以当两位数二进制表示中,尽量使两位数的二进制相反则异或最大这原创 2022-05-25 21:14:45 · 249 阅读 · 0 评论 -
数据结构:Trie字符串统计—Trie
C++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[原创 2022-05-24 23:29:31 · 119 阅读 · 0 评论 -
数据结构:表达式求值—栈
题目: AcWing 3302. 表达式求值给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小原创 2022-05-24 21:06:41 · 93 阅读 · 0 评论 -
数据结构:模拟散列表—哈希表
一般哈希表C++模板:(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) { int k = (x % N + N) % N; for (int i = h[k]; i != -1; i =原创 2022-05-10 20:47:04 · 192 阅读 · 0 评论 -
数据结构:模拟堆—堆
堆C++模板:// 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]); swap(h[a], h[b]);原创 2022-05-10 19:15:31 · 77 阅读 · 0 评论 -
数据结构:堆排序—堆
简单版堆C++模板:// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1int h[N], size;void down(int u){ int t = u; if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;原创 2022-05-09 21:29:01 · 321 阅读 · 0 评论 -
数据结构:连通块中点的数量—并查集
维护size的并查集C++模板:int p[N], size[N];//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量// 返回x的祖宗节点int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) { p[i] = i; size[i] = 1;}// 合原创 2022-05-08 09:27:07 · 192 阅读 · 0 评论 -
数据结构:合并集合—并查集
朴素并查集C++模板: int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){ if (p[x] != x) p[x] = find(p[x]); return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) p[i] = i;// 合并a和b所在的两个集合:void merge(int a,int b){ p[find(a)] = find(b);}并查集理解原创 2022-05-07 23:41:08 · 257 阅读 · 0 评论 -
数据结构:滑动窗口—单调队列
单调队列C++模板:常见模型:找出滑动窗口中的最大值/最小值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;}单原创 2022-05-07 21:06:23 · 193 阅读 · 0 评论 -
数据结构:单调栈
单调栈C++模板:常见模型:找出每个数左边离它最近的比它大/小的数int tt = 0;for (int i = 1; i <= n; i ++ ){ while (tt && check(stk[tt], i)) tt -- ; stk[ ++ tt] = i;}单调栈理解:单调栈就是维护栈里的元素单调上升,或者单调下降。如何维护?(假设取离它最近比你小的值)其实就是将当前值与栈里元素比较,如果栈里元素比它大,就弹出直到遇到比它小的,并把该元素推入原创 2022-05-07 10:06:45 · 222 阅读 · 0 评论 -
数据结构:模拟队列
模拟队列C++模板:// hh 表示队头,tt表示队尾int q[N], hh = 0, tt = 0;// 向队尾插入一个数q[ tt ++] = x;// 从队头弹出一个数hh ++ ;// 队头的值q[hh];// 判断队列是否为空if (hh <= tt){}题目: AcWing 829. 模拟队列实现一个队列,队列初始为空,支持四种操作:1.push x – 向队尾插入一个数 x;2.pop – 从队头弹出一个数;3.empty – 判断队列是原创 2022-05-06 21:52:35 · 121 阅读 · 0 评论 -
数据结构:模拟栈
模拟栈C++模板:// tt表示栈顶int stk[N], tt = 0;// 向栈顶插入一个数stk[ ++ tt] = x;// 从栈顶弹出一个数tt -- ;// 栈顶的值stk[tt];// 判断栈是否为空if (tt > 0){}题目: AcWing 828. 模拟栈实现一个栈,栈初始为空,支持四种操作:push x – 向栈顶插入一个数 x;pop – 从栈顶弹出一个数;empty – 判断栈是否为空;query – 查询栈顶元素。现在要对转载 2022-05-04 17:50:23 · 81 阅读 · 0 评论 -
数据结构:双链表
双链表C++模板:// e[]表示节点的值// l[]表示节点的左指针// r[]表示节点的右指针// idx表示当前用到了哪个节点// 假定0为左端点,1为右端点int e[N], l[N], r[N], idx;//初始化void init(){ //0是左端点,1是右端点 r[0]=1; l[1]=0; idx=2;}//在结点k的右边插入kvoid add(int k,int x){ e[idx]=x; l[idx]=k;原创 2022-05-04 17:19:13 · 123 阅读 · 0 评论 -
数据结构:单链表
单链表C++模板:// 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 ++ ;}// 将头结点删除,需要保证头结点存在原创 2022-05-04 16:21:26 · 66 阅读 · 0 评论