字串雜湊

2022-04-04 17:28:38 字數 1044 閱讀 4391

//hash

#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define ll long long

#define ull unsigned ll

const

intbase=131

;int prime=233317

;ull mod=212370440130137957ll;

intn;

ull a[

10010

];char s[10010

];using

namespace

std;

void read(int &x)

while(s>='

0' and s<='9'

) x*=f;

}ull hashe(

char

s) int

main()

雜湊其實是所有字串操作中,筆者認為最簡單的操作了(except輸入輸出qwq)。雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複(就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq),通過這種方式來替代一些很費時間的操作。

比如,最常見的,當然就是通過雜湊陣列來判斷幾個串是否相同(洛谷p3370)。此處的操作呢,很簡單,就是對於每個串,我們通過乙個固定的轉換方式,將相同的串使其的「密」一定相同,不同的串 盡量 不同。

此處有人指出:那難道不能先比對字串長度,然後比對ascll碼之和嗎?事實上顯然是不行的(比如ab和ba,並不是同乙個串,但是如是做卻會讓其認為是qwq)。這種情況就叫做hash衝突,並且在如此的單向加密雜湊中,hash衝突的情況在所難免(bzoj就有這種讓你給出一組樣例,使得一段雜湊**衝突的題,讀者可以嘗試嘗試)。

而我們此處介紹的,即是最常見的一種雜湊:進製雜湊。進製雜湊的核心便是給出乙個固定進製base,將乙個串的每乙個元素看做乙個進製位上的數字,所以這個串就可以看做乙個base進製的數,那麼這個數就是這個串的雜湊值;則我們通過比對每個串的的雜湊值,即可判斷兩個串是否相同

字串雜湊

參照演算法筆記p109,甲級1039 先假設字串均由大寫字母a z構成。在這個基礎上,不妨把a z視為0 25,這樣就把26個大寫字母對應到了26進製中。接著,按照將26進製轉化為10進製的思路,由進製的轉換結論可知,在進製轉換過程中,得到的10進製肯定是唯一的,由此便可實現將字串對映為整數的需求 ...

字串雜湊

昨天做了一道字串雜湊的題,感覺還好理解。今天的題看了 不知道為什麼,搜來搜去發現不知道的東西還很多,網上找到的東西也都是很零散,書上也沒有系統的講解。先自己整理一下這些零散的知識 關於字串涉及到的演算法大概有 hash kmp trie ac自動機等等,現在還都不明白是怎麼回事,這次先研究字串has...

字串雜湊

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