字串雜湊,用通俗點的說法就是將乙個字串轉換成乙個整數,而且用雜湊轉換出來的整數,不同的字串,不出意外整數也不一樣(存在極少的情況一樣),從而更方便地確定某個字串是否重複出現過或者對字串進行其他的判斷。
基本思想:
假設乙個字串:abcdabcd;
將整個字串看成乙個p(p一般取131或者13331比較好,可以減少衝突的概率,某個大神總結的經驗)進製數,將a->z看成1->26;然後abcdabcd就變成了:12341234;
將這個(12341234)轉化為十進位制數就是:
然後再用這個十進位制的結果模上乙個q(q一般取2^64,依舊是某位大神的建議),所得到的乙個範圍在1->q-1的整數就是該字串雜湊的值。
另外,q取2^64,整個過程用unsigned long long int 去訪問它(溢位的話不用管,因為溢位就想當於自動模乙個二的六十四次方),可以省去取模運算;
公式
乙個字串str,已知前i 個字元的hash值,求hash(i+1);
hish(i+1)=hash(i)x131+str[i+1]-『a』+1;
例如:字串:abcd
hash(『a』)=1;
hash(『ab』)=hash(『a』) x131+2;
hash(『abc』)=hash(『ab』)x131^2+3;
hash(『abcd』)=hash(『abc』)x131^3+4;
以上就是,該字串裡某段子串的hash值;
**:
hash[0]
=0;for
(int i=
1;i<=n;i++
)
這種演算法的優勢就是:我們可以用o(1)的時間來算出某個字串中的任何子串的hash值
當兩個字串的hash值相等,就可以知道這兩個字串是相同的。
Hash 字串 字串雜湊
luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...
雜湊has雜湊 字串hash
維護乙個集合,支援如下幾種操作 i x 插入乙個數x q x 詢問數x是否在集合 現過 現在要進行n次操作,對於每個詢問操作輸出對應的結果。輸入格式 第一行包含整數n,表示運算元量。接下來n行,每行包含乙個操作指令,操作指令為 i x q x 中的一種。輸出格式 對於每個詢問指令 q x 輸出乙個詢...
字串 字串雜湊hash演算法
以洛谷p3370為引子引入吧 雜湊其實是所有字串操作中,筆者認為最簡單的操作了 except輸入輸出qwq 雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複 就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq 通過這種方式來替代一些很費時間的操作。比如,最常見...