字串雜湊

2022-07-16 19:45:15 字數 987 閱讀 8758

字串雜湊主要用於判斷兩個字串是否相等,可以做到o(n)預處理,o(1)查詢。

其實就是把字串看成乙個數字,其進製為base(應大於字元種類),另外還要對某個數取模,可以自己選擇乙個大質數,也可以讓其對unsigned int或unsigned long long自然溢位。

因為是取過模,所以可能發生雜湊衝突,一般讓其自然溢位更容易被故意卡掉;選擇兩個大質數,利用兩個雜湊值來判斷據說不會被卡,但常數較大。

1 typedef unsigned long

long

ull;

2const ull base=233;3

inths[maxn],pw[maxn];

4char

s[maxn];

5void init()

11 inline int geths(int l,int r)

這裡我們採用了字首的思想,而求某一子串的雜湊值,就是將其左端點的上乙個點的字首推進,用右端點的字首相減就是子串的雜湊,最好手動模擬一下。

字串雜湊還有一種應用,可以在o(log)的時間複雜度下判斷子串的大小,二分兩個子串,求出他們最長公共字首,具體實現我是求第一次不同的位置,若這個位置超出了子串範圍,說明他們相等,否則比較這個位置上的字元大小即可。

1

intl1,r1,l2,r2;

2 scanf("

%d%d%d%d

",&l1,&r1,&l2,&r2);

3int i=l1,j=r1,k=l2+1,l=l2+1; //

注意這裡的下標,我們要找的是第乙個不一樣的位置

4while(ij)

9if(i>r1&&k>r2) printf("="

);10

else

if(r1-l1>r2-l2||s[l1]>s[l2]) printf("

>");

11else printf("

<

");

字串雜湊

參照演算法筆記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的字串,字串中只包含大小寫...