16 字串雜湊 雜湊表

2022-09-16 14:30:14 字數 2235 閱讀 2314

這個方法叫做字串字首雜湊法- -

先求出來每個字首的雜湊值

問題1:如何來定義某乙個字首的雜湊值

把這個字串看成是乙個p進製的數

每一位上的字母的ascii碼,就是這一位上的數

最後mod上乙個很小的數,就對映到0 ~ q - 1

這樣就可以把乙個字串轉換為乙個數字

注意事項1:

一般情況下,不能把某個字母對映成0

比如把a對映成0

那a,aa,aaa都是0了。這樣就把不同的字串對映成同樣的數字了,錯誤

注意事項2:

之前的雜湊方式是有處理衝突的機制的

這裡我們是假定不會有衝突的

從數學結論上看,在p = 131 或13331,q = 2 ^ 64的情況下

在99.99%的情況下,不會有衝突

至於為啥不會有衝突,這個就好比常見取模數是1000000001,1000000003,1000000007。可以直接記下來

問題2:這樣的雜湊方式再配合上字首雜湊,有啥好處

好處就是可以利用字首雜湊,計算出來每乙個子串的雜湊值。字首和思想,萬物皆可字首和

[l, r]的雜湊值就可以用公式

計算出來

我們直接用unsigned long long來儲存所有的h

這樣就不用對2 ^ 64取模了,溢位就等價於取模

預處理h陣列直接用

只要s[i]不是0就可以

1 #include 2

using

namespace

std;

3const

int n = 100010, p = 131;4

char

s[n];

5 typedef unsigned long

long

ull;

6ull h[n], p[n];7//

p陣列用來儲存p的多少次方

8 ull get(int l, int

r) 11

//雜湊值是0 ~ 2 ^ 64 - 1之間的乙個數

12int

main()

20while (m--) else28}

29return0;

30 }

Acwing 841 字串雜湊 字首雜湊

給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷 l1,r1 和 l2,r2 這兩個區間所包含的字串子串是否完全相同。字串中只包含大小寫英文本母和數字。輸入格式 第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含大小寫...

字串雜湊表

主要目的是實現基於字典的字串壓縮時,快速的判斷乙個詞是否出現在字典中並獲取其編碼。這種方法速度挺快,而且方便檔案讀寫,節約記憶體空間,主要是有趣。pragma once 1.如果使用合理的雜湊演算法,若雜湊值可以有無限位,那麼某些雜湊演算法得到的雜湊值不可能相同,自然溢位得到的32位雜湊值相同的概率...

hdu2920 字串雜湊

模式串中 把它分成一截截,當某一截在s串中多個位置能找到匹配,找第乙個匹配點,貪心 因為當中間有 可以利用它跳過一些字元,當遇到 先跳過乙個字元,其他的一截截貪心去找到匹配位置,若最後剩餘偶數個字元,則match 第一截和最後一截如果是非 和 必須嚴格匹配 找來的雜湊寫法 include inclu...