CH 1401兔子與兔子

2021-09-19 07:36:59 字數 1561 閱讀 8844

描述

很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 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

字串雜湊

把字串轉化為131進製,另字母a - z = 1 - 26,分配時要分配大於0的數字

已知s的雜湊值為hash(s),那麼在後面加乙個字母c的雜湊值為:

hash(s + c) = hash(s) + c - 'a' + 1最後加一是因為我們定義字母表示從1開始

已知s的雜湊值為hash(s)s + h的雜湊值為hash(s + h),那麼hash(h)的雜湊值為:

hash(h) = hash(s + h) - hash(s) * 131 ^ (length(h))最後乘是要把s + h的左端和s的左端對齊

p進製下,把乙個數左移k位相當於對這個數乘p^k

#include

#include

#include

using namespace std;

using ull =

unsigned

long

long

;const

int maxn =

1000005

;ull hash[maxn]

, p[maxn]

;//儲存雜湊值,儲存冪次值

char s[maxn]

;int

main()

int k, l1, r1, l2, r2;

scanf

("%d"

,&k)

;while

(k--

)return0;

}

CH1401 兔子與兔子

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

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

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

CH1401 兔子與兔子 字串 HASH

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