KMP,Tire,高階並查集

2022-05-26 19:00:09 字數 1759 閱讀 5791

**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...