// 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 ++
)}
int son[n][26
], cnt[n]
, idx;
// 0號點既是根節點,又是空節點
// son儲存樹中每個節點的子節點
// cnt儲存以每個節點結尾的單詞數量
// 插入乙個字串
void
insert
(char
*str)
cnt[p]++;
}// 查詢字串出現的次數
intquery
(char
*str)
return cnt[p]
;}
(
1)樸素並查集:
int p[n]
;//儲存每個點的祖宗節點
// 返回x的祖宗節點
intfind
(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的祖宗節點
intfind
(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
)維護到祖宗節點距離的並查集:
int p[n]
, d[n]
;//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離
// 返回x的祖宗節點
intfind
(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)
}voidup(
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應該插入的位置
intfind
(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)
資料結構 2
2016 02 06 17 38 指標和陣列 指標和一維陣列 陣列名一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址,它的值不能被改變 一維陣列名指向的是陣列的第乙個元素 下標和指標的關係 a i a i 假設指標變數的名字為p 則p i的值是p i p所指向的變數所佔的位元組數 指標變數...
資料結構2
定義 只允許在一端插入和刪除的線性表 允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 特點後進先出 lifo 棧的棧的主要操作 棧的主要操作主要操作 棧的主要操作 adtstack 棧的陣列表示 順序棧 define stacksize 100typedef char stack...
資料結構 2
class queue object 佇列 雙端佇列 def init self 私有化,封裝 self.queue def enqueue self item 從尾部往佇列中新增乙個元素 def enqueue start self item 從頭部新增元素 雙 self.queue.insert...