CH1401 兔子與兔子 字串 HASH

2022-06-26 03:51:09 字數 1870 閱讀 7571

描述

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

輸入格式

第一行乙個 dna 字串 s。

接下來乙個數字 m,表示 m 次詢問。

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

其中 1 ≤ length(s), m ≤ 1000000

輸出格式

對於每次詢問,輸出一行表示結果。如果兩隻兔子完全相同輸出 yes,否則輸出 no(注意大小寫)

樣例輸入

aabbaabb

31 3 5 7

1 3 6 8

1 2 1 2

樣例輸出
yes

noyes

**

羅翔宇,北京大學2023年資料結構與演算法a(實驗班)期末考試

題意:比較乙個字串的兩端區間內的子串是不是相同的

思路:要注意的是

之前在for的結束條件裡寫了i <= strlen(s+1),然後t了

因為strlen是o(n)的,放在了for條件裡的話就每次都做了一次o(n)

虐狗寶典字串hash的知識點:

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

去以固定值p,把字串看成p進製數,並分配乙個大於0的數值,代表每種字元。取乙個固定值m,求出該p進製數對m的餘數,作為該字串的hash值。

一般來說取p=131或p=13331。通常取m = 2^64,也就是直接使用unsigned long long儲存這個hash值,產生溢位時相當於自動對2^64取模。

只要hash值相同,我們就可以認為原字串是相等的。

上述hash演算法很難產生衝突,一般情況下完全可以用在題目的標準解答中。還可以多取一些恰當的p和m的值,多進行幾組hash運算。

如果已知字串s的hash值為h(s),那麼在s後新增乙個字元c的新字串的hash值就是h(s+c)=(h(s)*p+val[c])modm

如果已知字串s的hash值為h(s),字串s+t的hash值為h(s+t),那麼字串t的hash值h(t)=(h(s+t) -h(s)*plength(t))mod m

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10

#define inf 0x7f7f7f7f

1112

const

int maxn = 1e6 + 5;13

char

s[maxn];

14int

m;15

intl1, r1, l2, r2;

16 unsigned long

long

h[maxn], p[maxn];

1718

intmain()

1928 scanf("

%d", &m);

29while(m--)

34else37}

3839

40 }

CH 1401 兔子與兔子(字串雜湊)

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

CH 1401兔子與兔子

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

CH1401 兔子與兔子

hash的入門題,通過hash我們可以在o 1 的時間裡判斷乙個字串的任意子串是否相等,恰好符合本題題意。設計hash函式f i 儲存字串s第1 i的子串的雜湊值。顯然存在f i f i 1 131 s i a 1 有了f陣列,就可以求出任意子串的雜湊值,因此我們就可以判斷任意子串是否相等。若要求字...