維護乙個集合,支援如下幾種操作:
「i x」,插入乙個數x;
「q x」,詢問數x是否在集合**現過;
現在要進行n次操作,對於每個詢問操作輸出對應的結果。
輸入格式
第一行包含整數n,表示運算元量。
接下來n行,每行包含乙個操作指令,操作指令為」i x」,」q x」中的一種。
輸出格式
對於每個詢問指令「q x」,輸出乙個詢問結果,如果x在集合**現過,則輸出「yes」,否則輸出「no」。每個結果佔一行。
資料範圍
1≤n≤105
−109≤x≤109
拉鍊法演算法思想:
拉鍊法儲存結構,申請乙個h[n]陣列對映輸入的資料,由於不同的資料可能會對映到同乙個位置上,所以每乙個位置上再設定鍊錶儲存資料。
程式**:
#include
#include
using
namespace std;
const
int n =
100003
;int h[n]
, e[n]
, ne[n]
, idx;
void
insert
(int x)
bool
find
(int x)
intmain()
}return0;
}
開放定址法演算法思路:
申請乙個陣列h[n]存放對映陣列,若某個數對映的位置已經被其他數占領,則向後移動一位,直到找到空位置。find(x)函式就是尋找空位置並返回它應該被放置的位置。
程式**:
#include
#include
using
namespace std;
const
int n =
200003
, null =
0x3f3f3f3f
;int h[n]
;int
find
(int x)
return k;
}int
main()
}return0;
}
給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷[l1,r1]和[l2,r2]這兩個區間所包含的字串子串是否完全相同。
字串中只包含大小寫英文本母和數字。
輸入格式
第一行包含整數n和m,表示字串長度和詢問次數。
第二行包含乙個長度為n的字串,字串中只包含大小寫英文本母和數字。
接下來m行,每行包含四個整數l1,r1,l2,r2,表示一次詢問所涉及的兩個區間。
注意,字串的位置從1開始編號。
輸出格式
對於每個詢問輸出乙個結果,如果兩個字串子串完全相同則輸出「yes」,否則輸出「no」。
每個結果佔一行。
資料範圍
1≤n,m≤105
輸入樣例:
8 3aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
輸出樣例:
yesno
yes演算法基本思路:
先將字串看成p進製的數,然後將p進製數轉化為十進位制數。該題把字串所有字首的雜湊值求解出來,再算出區間的雜湊值,進行比較,若兩個雜湊值一樣,則兩個區間的字串子串是完全相同的。區間內的hash = h[ r ] - h[l - 1] *p ^(r - l + 1)
程式**:
#include
using
namespace std;
const
int n =
100010
, p =
131;
typedef
unsigned
long
long ull;
int n, m;
char str[n]
;ull h[n]
, p[n]
;int
get(
int l,
int r)
intmain()
while
(m --
)return0;
}
資料結構 雜湊表(模擬雜湊表 字串雜湊)
1.雜湊表的定義 給定表m,存在函式f key 對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊 hash 表,函式f key 為雜湊 hash 函式。2.雜湊表的用途 把乙個較大範圍的值域對映到乙個較小的範圍 3.雜湊表的原理 通過對大數取餘運算把乙個大...
資料結構 雜湊表(雜湊表)hash table
hash table 在計算機中,雜湊表 是 一種實現了關聯陣列 抽象資料型別的資料結構,這種資料結構可以對映 鍵 key 和 值 value 補充 關聯陣列 在電腦科學中,乙個關聯陣列 associative array 對映 map 符號表 symbol table 或者是字典 dictiona...
資料結構 雜湊表 雜湊表 原理
記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜湊函式,又稱為雜湊 hash函式 採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表 hash table 雜湊表hashtable key,value 就是把key通過乙個固定的演算法函式既所謂的雜湊函式轉換成乙個整型...