給定乙個長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的字串,字串中只包含大小寫...