**acwing
tire
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的並查集:
intp[n], size[n];
//p儲存每個點的祖宗節點, size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量
//返回x的祖宗節點
int find(int
x)
//初始化,假定節點編號是1~n
for (int i = 1; i <= n; i ++)
//合併a和b所在的兩個集合:
size[find(b)] +=size[find(a)];
p[find(a)] =find(b);(3
)維護到祖宗節點距離的並查集:
intp[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)的偏移量
堆 —— 模板題 acwing 838. 堆排序, acwing 839
. 模擬堆
//h[n]儲存堆中的值, h[1]是堆頂,x的左兒子是2x, 右兒子是2x + 1
//ph[k]儲存第k個插入的點在堆中的位置
//hp[k]儲存堆中下標是k的點是第幾個插入的
inth[n], ph[n], hp[n], size;
//交換兩個點,及其對映關係
void heap_swap(int a, int
b)void down(intu)}
void up(intu)}
//o(n)建堆
for (int i = n / 2; i; i -- ) down(i);
kmp
//s是長文字,p是模式串,n是s的長度,m是p的長度
求模式串的next陣列:
for (int i = 2, j = 0; i <= m; i ++)
//匹配
for (int i = 1, j = 0; i <= n; i ++)
}
並查集高階
n 個孤立點,m 次加邊操作,設 l i,j 表示結點 i 和 j 最早在第 l i,j 次操作後連通。在 m 次操作後,求出 sum n sum n l i,j 的值。解法 quad 並查集的時候記錄子樹大小即可。n 個孤立點,m 次加邊操作,q 次詢問,每一次問 u 和 v 最早在第幾次操作後連...
並查集入門 高階
入門解釋 高階解釋 入門篇模板 define arr size 100 int pre arr size int deep arr size void init int pre find int x return pre find pre x 遞迴查詢 void unite int x,int y ...
詳解 並查集高階技巧 加權並查集 擴充套件域並查集
可以理解為使用陣列實現的樹形結構,只儲存了每個節點的父節點 前驅 功能為 合併兩個節點 及其所在集合 查詢節點所屬集合的代表節點 可以理解為根節點 以6個元素為例 編號0到5 把0單獨劃分為乙個集合 把1,2,3,4劃分為乙個集合 把5單獨劃分為乙個集合。n個元素的並查集,只需要乙個容量為n的陣列f...