字串Hash學習筆記

2022-04-02 16:22:58 字數 2608 閱讀 4023

[toc]

# 以下內容作廢,太多錯誤了,等我有時間重寫

說一下什麼是hash,說白了就是把一大坨字元用一些神奇的數來表示,可以說是把字元加密了.

簡單一點就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存(更小)或比較。

字串hash的靈魂就是盡量讓不同的字串對應唯一的hsah的值 .而要實現這一效果就要選對方法否則就咕咕咕了

舉個栗子:

如果我們的加密方法是把字元的ascal

加起來,那就咕咕咕了.

比如:ababa

babaa

加起來是一樣的,咕咕咕....

所以應該怎麼hash?

它的主要思路是選取恰當的進製,可以把字串中的字元看成乙個大數字中的每一位數字,不過比較字串和比較大數字的複雜度並沒有什麼區別(高精數的比較也是o(n

)'>o(n)o(n)的),但只要把它對乙個數取模,然後認為取模後的結果相等原數就相等,那麼就可以在一定的錯誤率的基礎上o(1

)'>o(1)o(1)進行判斷了。

那麼我們選擇什麼進製比較好?

首先不要把任意字元對應到數字0,比如假如把a對應到數字0,那麼將不能只從hash結果上區分ab和b(雖然可以額外判斷字串長度,但不把任意字元對應到數字0更加省事且沒有任何***),一般而言,把a-z對應到數字1-26比較合適。

關於進製的選擇實際上非常自由,大於所有字元對應的數字的最大值,不要含有模數的質因子(那還模什麼),比如乙個字符集是a到z的題目,選擇27、233、19260817都是可以的。

模數的選擇(盡量還是要選擇質數):

絕大多數情況下,不要選擇乙個10

9'>109109級別的數,因為這樣隨機資料都會有hash衝突,根據生日悖論,隨便找上10

9'>109−−−√109個串就有大概率出現至少一對hash 值相等的串

最穩妥的辦法是選擇兩個10

9'>109109級別的質數,只有模這兩個數都相等才判斷相等,但常數略大,**相對難寫,目前暫時沒有辦法卡掉這種寫法(除了卡時間讓它超時)

如果能背過或在考場上找出乙個1018

'>10181018級別的質數(miller-rabin),也相對靠譜,主要用於前一種擔心會超時,後一種擔心被卡。

偷懶的寫法就是直接使用unsigned long long,不手動進行取模,它溢位時會自動對264

'>26426

4'>送上一道模板題:

如題,給定n個字串(第i個字串長度為mi,字串內包含數字、大小寫字母,大小寫敏感),請求出n個字串中共有多少個不同的字串。26

4'>輸入格式:

第一行包含乙個整數n,為字串的個數。

接下來n行每行包含乙個字串,為所提供的字串。26

4'>輸出格式:

輸出包含一行,包含乙個整數,為不同的字串個數。

輸入樣例#1: 複製

5

abcaaaa

abcabcc

12345

輸出樣例#1: 複製

4
時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=10,mi≈6,mmax<=15;

對於70%的資料:n<=1000,mi≈100,mmax<=150

對於100%的資料:n<=10000,mi≈1000,mmax<=1500

**:

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long int

#define mod 1000000007

using

namespace

std;

const

long

long

int maxn=99999999999999

;const

int minn=-999999999

;long

long

base=131

;long

long a[15010

];char s[15010

];int n,ans=1

;long

long hash(char

s) int 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);

}

送上取膜數對答案的影響:

改了一下mod為0x3f3f3f就

演算法筆記 字串hash

概述 主要用於字串的匹配。定義hash函式 h c c1bm 1 c2bm 2 cmb0 mod h 對於字串c中l r區間的hash值 h l,r h 1,r h 1,l 1 br l 1 如果hash值很大,對h取模,一般地,用unsigned long long 來儲存資料,這樣溢位時就會自動...

Hash 字串 字串雜湊

luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...

白兔的字串 字串hash

原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...