這個方法叫做字串字首雜湊法- -
先求出來每個字首的雜湊值
問題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 2using
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...