Acwing 138 兔子與兔子 Hash字串

2021-09-25 21:13:05 字數 1702 閱讀 2563

acwing-138. 兔子與兔子

很久很久以前,森林裡住著一群兔子。

有一天,兔子們想要研究自己的 dna 序列。

我們首先選取乙個好長好長的 dna 序列(小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母)。

然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。

注意兩個兔子一模一樣只可能是他們的 dna 序列一模一樣。

輸入格式

第一行輸入乙個 dna 字串 s。

第二行乙個數字 m,表示 m 次詢問。

接下來 m 行,每行四個數字 l1,r1,l2,r2,分別表示此次詢問的兩個區間,注意字串的位置從1開始編號。

輸出格式

對於每次詢問,輸出一行表示結果。

如果兩隻兔子完全相同輸出 yes,否則輸出 no(注意大小寫)。

資料範圍

1≤length(s),m≤1000000

輸入樣例:

aabbaabb

31 3 5 7

1 3 6 8

1 2 1 2

輸出樣例:
yes

noyes

思路:字串hash

字串hash函式把乙個任意長度的字串對映為乙個非負整數,並且其衝突概率幾乎為0.

取乙個固定值p,把字串看作p進製數。求出p進製數->10進製數對m的取模就是字串的hash值。一般我們取p = 131或p=13331,此時hash值產生衝突的概率極低,只要hash值相同,我們就可以認定字串是相同的。通常我們取m=2

64

m=2^64

m=26

4 ,我們可以直接使用unsigned long long 型別來存這個hash值,在計算時,自動對264

2^64

264取模。

當我們知道hash(i)值,求hash(i+1) = hash(i)*p+s[i+1]。例如:hash(abcd) = hash(abc)*p + d;

當我們求某一字串中[l,r]的hash值,我們可以使用has

h=ha

sh[r

]−ha

sh[l

−1]∗

pr−l

+1

hash = hash[r] - hash[l-1]*p^

hash=h

ash[

r]−h

ash[

l−1]

∗pr−

l+1來求出。

**:

#include

using

namespace std;

const

int maxn =

1000000+20

;const

int base =

131;

//使用131衝突率低

typedef

unsigned

long

long ull;

ull p[maxn]

, hash[maxn]

;char s[maxn]

;int

main()

cin >> m;

int l1, r1, l2, r2;

while

(m--

)return0;

}

AcWing 138 兔子與兔子 雜湊

題目描述 很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。...

AcWing 138 兔子與兔子 雜湊

題目描述 很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。...

兔子與兔子

很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。注意兩個兔...