ACWing 841 字串雜湊

2021-10-19 08:27:16 字數 1765 閱讀 2545

給定乙個長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​]的子串是否相等。如果相等輸出「yes」否則輸出「no」。

輸入格式:

第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含大小寫英文本母和數字。接下來m

mm行,每行包含四個整數l1,

r1,l

2,r2

l_1,r_1,l_2,r_2

l1​,r1

​,l2

​,r2

​,表示一次詢問所涉及的兩個區間。注意,字串的位置從1開始編號。

輸出格式:

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

資料範圍:

1 ≤n

,m≤1

05

1\le n,m\le 10^5

1≤n,m≤

105思路是字串雜湊。給定乙個字串s

ss,視其下標是從0

00開始編號的,那麼其字首雜湊陣列h

hh滿足h[0

]=

0h[0]=0

h[0]=0

,並且h[i

]=h[

i−1]

×p+s

[i

]h[i]=h[i-1]\times p+s[i]

h[i]=h

[i−1

]×p+

s[i]

這裡p

pp一般取131

13113

1或者13331

13331

1333

1,以降低衝突概率。對於任意s

ss的子串s[i

:j

]s[i:j]

s[i:j]

,其雜湊值是h[j

+1]−

h[i]

×pj−

i+

1h[j+1]-h[i]\times p^

h[j+1]

−h[i

]×pj

−i+1

具體**直接套公式即可。**如下:

#include

#include

using

namespace std;

const

int n =

100010

;long h[n]

, p[n]

;const

long p =

131;

longha(

int l,

int r)

intmain()

while

(m--

)return0;

}

預處理時間複雜度o(n

)o(n)

o(n)

,每次詢問o(1

)o(1)

o(1)

,空間o(n

)o(n)

o(n)

AcWing 841 字串雜湊

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

AcWing 841 字串雜湊

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

Acwing 841 字串雜湊 字首雜湊

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