字串雜湊 模板

2022-03-11 13:58:54 字數 1987 閱讀 7536

雜湊本身是很簡單的,單考的概率也非常低,基本都是結合到其他題目中的乙個小知識點,就像離散化一樣。

雜湊做法是固定的:

首先設乙個進製數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位的雜湊...