模板 字串雜湊

2022-06-10 07:00:08 字數 840 閱讀 9649

字串雜湊是用與比較兩個字串是否一樣的演算法,進行操作後比較的時間複雜度可以達到o(1)。

其原理也十分簡單,將每乙個字串視為乙個數字。這樣在比較時只要比較兩個字串對應的數字是不是一樣即可。實現的原理是構建乙個x進製(x為素數)的數字,同時由於x在過大的情況會導致資料爆了。所以我們一般會選擇乙個非常大的模數,可以直接使用c++的unsigned long long,其效果是超過long long 範圍時自動取模。

最後由於取模的原因,可能會在極低概率下情況出現hash衝突(兩個不同的字串對應乙個資料)。可以採用雙hash法(,雙hash就是對乙個hash值用兩個不同的質數進行兩次mod操作,然後最後用一對數來表示乙個字串的雜湊值,這樣的一對數的重複機率加上選擇較大的質數,衝突率幾乎為0。)

以及x的選擇 一般使用131 1331 133331這種資料(科學研究的結果 出現衝突概率會比較低)

例題[洛谷p3370](

#include #include#include#include#include#include#includeusing namespace std;

typedef unsigned long long ull;

ull base=13331;

ull hashcode;

string s;

ull a[15005];

int n,temp,ans;

void hash(string s)

sort(a,a+temp);

for(int i=0;icout

}// freopen("testdata.in", "r", stdin);

字串雜湊 模板

以下文字 據我的理解,hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。字串hash的種類還是有很多種...

模板 字串雜湊

如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母,大小寫敏感 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字串個數。s am plei nput sample input...

字串雜湊(模板)

尋找長度為n的主串s中的匹配串t 長度為m 出現的位置或次數屬於字串匹配問題。字串雜湊就是將每個字串轉化為乙個數值,然後遍歷主串,判斷在主串起始位置為i長度為m的字串的雜湊值與匹配串的雜湊值是否相等即可,每次判斷為o 1 的時間。這樣就可以轉化為o n 的時間完成判斷。若求字串中第i位到第j位的雜湊...