兔子與兔子(字串hash)

2021-10-04 06:46:02 字數 1196 閱讀 1588

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

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

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

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

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

輸入格式

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

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

接下來 m 行,每行四個數字 l1,r1,l2,r2l1,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轉換成乙個(unsigned long long 型別的)整數的對映放在h陣列裡,h[i]表示以i位置的字首對映成的整數數值,power陣列記錄每一位的位權131的x次冪(131進製數),然後對於讀入字串的任意乙個字串都可以o(1)地找到其對應的數值(這也是這種hash的優點);

[l,r]這個區間的hash值=h[r]-h[l-1]*power[r-l+1];

若數值相同則兩串相同,否則不同。

完整**:

#include #include using namespace std;

const int maxn=1e6+10,p=131;

typedef unsigned long long ull;

ull h[maxn],power[maxn];

char str[maxn];

ull get(int l,int r)

int main()

int m;

cin>>m;

while(m--)

return 0;

}

字串 Hash 兔子與兔子

字串hash可以把乙個長度任意的字串對映成乙個非負整數,並且其衝突概率幾乎為0 取一固定值p,把字串看作p進製數,並分配乙個大於0的值,代表每種字元。一般來說,分配的數都遠小於p。例如 a 1,b 2 z 26 取乙個固定值m,求出該p進製對m的餘數,作為hash值。一般來說,p取131或者1333...

CH1401 兔子與兔子 字串 HASH

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

hash 兔子與兔子(C )

time limit 10 sec memory limit 128 mb submit 376 solved 75 submit status web board 很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的dna序列。我們首先選取乙個好長好長的dna序列 小兔子是外星生物,dn...