雜湊本身是很簡單的,單考的概率也非常低,基本都是結合到其他題目中的乙個小知識點,就像離散化一樣。
雜湊做法是固定的:
首先設乙個進製數base,並設乙個模數mod
而雜湊其實就是把乙個數轉化為乙個值,這個值是base進製的,儲存在雜湊表中,注意一下在存入的時候取模一下即可
這裡介紹三種雜湊方法:
自然溢位雜湊:
#include #include#include
using
namespace
std;
typedef unsigned
long
long
ull;
ull
base=131
;ull a[
10010
];char s[10010
];int n,ans=1
;ull hashs(
char
s)main()
sort(a+1,a+n+1
);
for (int i=2;i<=n;i++)
if (a[i]!=a[i-1
]) ans++;
printf(
"%d\n
",ans);
}
最穩妥的辦法是選擇兩個10^9級別的質數,只有模這兩個數都相等才判斷相等,但常數略大,**相對難寫,目前暫時沒有辦法卡掉這種寫法(除了卡時間讓它超時)
#include #include#include
using
namespace
std;
typedef unsigned
long
long
ull;
ull
base=131
;struct
data
a[10010
];char s[10010
];int n,ans=1
;ull mod1=19260817
;ull mod2=19660813
;ull hash1(
char
s)ull hash2(
char
s)bool
comp(data a,data b)
main()
sort(a+1,a+n+1
,comp);
for (int i=2;i<=n;i++)
if (a[i].x!=a[i-1].x || a[i-1].y!=a[i].y)
ans++;
printf(
"%d\n
",ans);
}
如果能背過或在考場上找出乙個10^18級別的質數(miller-rabin),也相對靠譜,主要用於前一種擔心會超時
這是只用乙個10^18質數的hash(100)
#include #include#include
using
namespace
std;
typedef unsigned
long
long
ull;
ull
base=131
;ull a[
10010
];char s[10010
];int n,ans=1
;ull mod=212370440130137957ll;//
是質數!!
ull hashs(char
s)main()
sort(a+1,a+n+1
);
for (int i=2;i<=n;i++)
if (a[i]!=a[i-1
]) ans++;
printf(
"%d\n
",ans);
}
字串雜湊 模板
以下文字 據我的理解,hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。字串hash的種類還是有很多種...
模板 字串雜湊
如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母,大小寫敏感 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字串個數。s am plei nput sample input...
字串雜湊(模板)
尋找長度為n的主串s中的匹配串t 長度為m 出現的位置或次數屬於字串匹配問題。字串雜湊就是將每個字串轉化為乙個數值,然後遍歷主串,判斷在主串起始位置為i長度為m的字串的雜湊值與匹配串的雜湊值是否相等即可,每次判斷為o 1 的時間。這樣就可以轉化為o n 的時間完成判斷。若求字串中第i位到第j位的雜湊...