单链表
1 | # head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 |
双链表
1 | # e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点 |
栈
1 | # tt表示栈顶 |
普通队列
1 | # hh 表示队头,tt表示队尾 |
循环队列
1 | # hh 表示队头,tt表示队尾的后一个位置 |
单调栈
1 | N = 1000 |
单调队列
1 | N = 1000 |
KMP
1 | # s[]是长文本,p[]是模式串,n是s的长度,m是p的长度 |
Trie树
1 | N = 1000 |
并查集
1 | N = 1000 |
维护 size
1
2
3
4
5
6
7
8
9
10
11
12
13 N = 1000
p, size = list(range(N)), [1] * N
# p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量
# 返回x的祖宗节点
def find(x:int):
if p[x] != x:
p[x] = find(p[x])
return p[x]
# 合并a和b所在的两个集合:
size[find(b)] += size[find(a)]
p[find(a)] = find(b)
维护到祖宗节点的距离
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 N = 1000
p, d = list(range(N)), [0] * N
# p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离
# 返回x的祖宗节点
def find(x:int):
if p[x] != x:
u = find(p[x])
d[x] += d[p[x]]
p[x] = u
return p[x]
# 合并a和b所在的两个集合:
p[find(a)] = find(b)
d[find(a)] = distance; # 根据具体问题,初始化find(a)的偏移量
图
1 | N, M = 1000, 100 |