AcWing 841 字串雜湊

2022-09-23 03:33:13 字數 1292 閱讀 4595

給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數 l1,r1,l2,r2 ,請你判斷[ l1,r1 ]和[ l2,r2 ]這兩個區間所包含的字串子串是否完全相同。

字串中只包含大小寫英文本母和數字。

輸入格式

第一行包含整數n和m,表示字串長度和詢問次數。

第二行包含乙個長度為n的字串,字串中只包含大小寫英文本母和數字。

接下來m行,每行包含四個整數 l1,r1,l2,r2 ,表示一次詢問所涉及的兩個區間。

注意,字串的位置從1開始編號。

輸出格式

對於每個詢問輸出乙個結果,如果兩個字串子串完全相同則輸出「yes」,否則輸出「no」。

每個結果佔一行。

資料範圍

1 ≤ n, m ≤ 105

輸入樣例:

8 3aabbaabb

1 3 5 7

1 3 6 8

1 2 1 2

輸出樣例:

yesno

yes思路:

字串雜湊,目的是將乙個字串字首轉換乙個\(mod 2^\)的整數,將乙個字串轉化成p進製,其中p經常取得是131或者13331,然後取模使用自然取模法,就是使用unsigned long long來儲存字首和,自然溢位後就是取模得結果。

將字串的字首轉換為數來存值

由於每位的權值是不一樣的 所以每個字首值都對應著唯一的一種字串

所以相減後的值也應該是唯一的 從而利用相減後的值可以判斷字串的區間段是否相等

#include#include#includeusing namespace std;

// 小技巧:取模的數用2^,這樣直接用unsigned long long儲存,溢位的結果就是取模的結果

typedef unsigned long long ull;

const int n = 100010;

char str[n];

ull h[n], p[n]; // h表示乙個字串的字首和

// p表示各個位的權重

int p = 131; // 131 或者 13331

ull get(int l, int r)

int main()

} while(m--)

return 0;

}

參考

AcWing 841 字串雜湊

題目描述 給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷 l1,r1和 l2,r2這兩個區間所包含的字串子串是否完全相同。字串中只包含大小寫英文本母和數字。輸入格式 第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含...

ACWing 841 字串雜湊

給定乙個長n nn的字串s ss,再給定m mm次詢問,每次詢問含四個整數l1,r1,l 2,r2 l 1,r 1,l 2,r 2 l1 r1 l2 r2 問s ss的兩個區間 l1 r1 l 1,r 1 l1 r 1 和 l2 r2 l 2,r 2 l2 r 2 的子串是否相等。如果相等輸出 ye...

Acwing 841 字串雜湊 字首雜湊

給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷 l1,r1 和 l2,r2 這兩個區間所包含的字串子串是否完全相同。字串中只包含大小寫英文本母和數字。輸入格式 第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含大小寫...