單鏈表
// head儲存煉表頭,e儲存節點的值,ne儲存節點的next指標,idx表示當前用到了哪個節點
int head, e[n], ne[n], idx;
// 初始化
void init()
// 在煉表頭插入乙個數a
void insert(int a)
// 將頭結點刪除,需要保證頭結點存在
void remove()
雙鏈表
// e表示節點的值,l表示節點的左指標,r表示節點的右指標,idx表示當前用到了哪個節點
int e[n], l[n], r[n], idx;
// 初始化
void init()
// 在節點a的右邊插入乙個數x
void insert(int a, int x)
// 刪除節點a
void remove(int a)
棧
// 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];
// 判斷佇列是否為空
if (hh <= tt)
單調棧
常見模型:找出每個數左邊離它最近的比它大/小的數
int tt = 0;
for (int i = 1; i <= n; i ++ )
單調佇列
常見模型:找出滑動視窗中的最大值/最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
kmp
求next陣列:
// s是模式串,p是模板串, n是s的長度,m是p的長度
for (int i = 2, j = 0; i <= m; i ++ )
// 匹配
for (int i = 1, j = 0; i <= n; i ++ )
}
trie樹
int son[n][26], cnt[n], idx;
// 0號點既是根節點,又是空節點
// son儲存樹中每個節點的子節點
// cnt儲存以每個節點結尾的單詞數量
// 插入乙個字串
void insert(char *str)
cnt[p] ++ ;
}// 查詢字串出現的次數
int query(char *str)
return cnt[p];
}
並查集
(1)樸素並查集:
int p[n]; //儲存每個點的祖宗節點
// 返回x的祖宗節點
int find(int x)
// 初始化,假定節點編號是1~n
for (int i = 1; i <= n; i ++ ) p[i] = i;
// 合併a和b所在的兩個集合:
p[find(a)] = find(b);
(2)維護size的並查集:
int p[n], size[n];
//p儲存每個點的祖宗節點, size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量
// 返回x的祖宗節點
int find(int x)
// 初始化,假定節點編號是1~n
for (int i = 1; i <= n; i ++ )
// 合併a和b所在的兩個集合:
p[find(a)] = find(b);
size[b] += size[a];
(3)維護到祖宗節點距離的並查集:
int p[n], d[n];
//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離
// 返回x的祖宗節點
int find(int x)
return p[x];
}// 初始化,假定節點編號是1~n
for (int i = 1; i <= n; i ++ )
// 合併a和b所在的兩個集合:
p[find(a)] = find(b);
d[find(a)] = distance; // 根據具體問題,初始化find(a)的偏移量
堆
// 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)
void down(int u)
}void up(int u)
}// o(n)建堆
for (int i = n / 2; i; i -- ) down(i);
一般雜湊
(1) 拉鍊法
int h[n], e[n], ne[n], idx;
// 向雜湊表中插入乙個數
void insert(int x)
// 在雜湊表中查詢某個數是否存在
bool find(int x)
(2) 開放定址法
int h[n];
// 如果x在雜湊表中,返回x的下標;如果x不在雜湊表中,返回x應該插入的位置
int find(int x)
return t;
}
字串雜湊
核心思想:將字串看成p進製數,p的經驗值是131或13331,取這兩個值的衝突概率低
小技巧:取模的數用2^64,這樣直接用unsigned long long儲存,溢位的結果就是取模的結果
typedef unsigned long long ull;
ull h[n], p[n]; // h[k]儲存字串前k個字母的雜湊值, p[k]儲存 p^k mod 2^64
// 初始化
p[0] = 1;
for (int i = 1; i <= n; i ++ )
// 計算子串 str[l ~ r] 的雜湊值
ull get(int l, int r)
資料結構模板 棧
此部落格是存的是我自己編寫的棧模板,如有錯誤請指出棧是操作受限的線性表,只允許在棧頂進行插入和刪除操作,遵循 後進先出 原則。include include define elemtype int define maxsize 1000 using namespace std 這是順序棧的模板 ty...
資料結構模板 佇列
此部落格是存的是我自己編寫的佇列模板,如有錯誤請指出佇列是操作受限的線性表,只允許在隊頭進行刪除操作,在隊尾進行插入操作,遵循 先進先出 原則。順序隊 存在假溢位問題 include include define elemtype int define maxsize 1000 using name...
資料結構模板合集
線段樹lazy操作模板 區間修改,區間查詢 class segment tree lazy inline void add int p,int v,int t inline void pushdown int p,int l,int r public inline void build tree i...