雜湊用於字串處理(快速判斷兩個字串是否相同)。先介紹一下雜湊的思想:ab
c=97∗
p2+98
∗p1+
99∗p0
a bc
=97∗p
2+98∗
p1+99
∗p0ab
d=97∗
p2+98
∗p1+
100∗p0
a bd
=97∗p
2+98∗
p1+100∗p
0abcd=97
∗p3+
98∗p2
+99∗p
1+100∗p0
a bc
d=97∗
p3+98
∗p2+
99∗p1
+100∗p
0顯然我們相當於把字串變成乙個p進製的數(稱作這個字串的雜湊值),然後如果這個p進製的數相同就可以確定這兩個字串是相同的。但是我們發現:這個數可能會很大,所以我們只能把這兩個數進行取模,限制在int範圍內。但是由於取模,雜湊值相同的字串不一定相同。不過在模很大的情況下,雜湊值相同,兩個字串是大概率相同的。也就是說,如果只判斷兩個字串,我們只用計算兩個串的雜湊值然後比較是否相同,wa的機率是
1100000000
1
100000000
。但是還有一類問題,我們需要判斷某乙個串是否出現過。有乙個很直接的想法就是把所有雜湊值放到bool陣列中,計算乙個,判斷這個雜湊值是否出現過。但是這個時候精度問題就十分感人。這個時候我們就需要雙雜湊,我們取不同的p和不同的模數,對於乙個串計算兩個雜湊值,如果這兩個同時出現過,那麼也可以判斷這個串出現過了。
雜湊的思想是很簡單的,但是寫法上有技巧(令人窒息,第一次考試寫wa了)。
for(int j=0;j
j++)
for(int j=0;j
j++)
hash=(hash*p+a[j])%mod;
再看一看二維雜湊。
二維雜湊的姿勢要奇怪一點,先把p的次方填滿矩陣:
然後每個格仔乘上該格仔的數,然後求矩陣字首和。之後我們就可以o1查詢每個矩陣的雜湊值(支援加減)。雖然左上角次數不同,我們把所有次數乘成相同的就行。
有雙雜湊判斷是否出現。
時間限制: 1000 ms 記憶體限制: 131072 kb
提交數: 33 通過數: 10
給出乙個 n×
m n×m
的矩陣。讓你從中發現乙個最大的正方形。使得這樣子的正方形在矩陣 中出現了至少兩次。輸出最大正方形的邊長。
第一行兩個整數
n n
,m' role="presentation" style="position: relative;">m
m代表矩陣的長和寬;
接下來
n n
行,每行
m' role="presentation" style="position: relative;">m
m個字元(小寫字母) ,表示矩陣。
輸出乙個整數表示滿足條件的最大正方形的邊長。
5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl
3
對於 30%的資料,n,
m≤100 n,m
≤100
;對於 100%的資料,n,
m≤500 n,m
≤500
。正如上面的方法,附上**:
#include
#include
#include
using
namespace
std;
struct lxyb[250005];
int head[100005];
long
long pr1=97,pr2=233,mod1=94271,mod2=19260819;
int n,m,ans,cnt;
long
long p1[250005],p2[250005];
long
long hash1[505][505],hash2[505][505];
char s[505][505];
void add(int op,int ed)
bool check(int k)
add(has1,has2);
} return
false;
} void er(int l,int r)
int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
er(1,min(n,m));
cout
<
}
雜湊表 Hash Table 雜湊概述
雜湊表支援一種最有效的檢索方法 雜湊。從根來上說,乙個雜湊表包含乙個陣列,通過特殊的索引值 鍵 來訪問陣列中的元素。雜湊表的主要思想是通過乙個雜湊函式,在所有可能的鍵與槽位之間建立一張對映表。雜湊函式每次接受乙個鍵將返回與鍵相對應的雜湊編碼或雜湊值。鍵的資料型別可能多種多樣,但雜湊值的型別只能是整型...
雜湊表概述
基本概念 通過記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f以及處理衝突的方法,使得每個關鍵字和結構中乙個唯一的位置相對應。這樣對於關鍵字k根據對應關係f,就可以得到儲存位置f k 稱這種對應關係f為雜湊函式。與二叉樹不同,雜湊表中儲存的資料是無序的,對於查詢任意資料高效,二叉樹查詢某一範圍...
雜湊表概述
雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表或雜湊表。具體表現為 儲存位置 f key 1.在儲存時,通過雜湊函式計...