[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輸出樣例#1: 複製abcaaaa
abcabcc
12345
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...