阿軒在紙上寫了兩個字串,分別記為a和b。
利用在資料結構與演算法課上學到的知識,他很容易地求出了「字串a從任意位置開始的字尾子串」與「字串b」匹配的長度。
不過阿軒是乙個勤學好問的同學,他向你提出了q個問題:
在每個問題中,他給定你乙個整數x,請你告訴他有多少個位置,滿足「字串a從該位置開始的字尾子串」與b匹配的長度恰好為x。
例如:a=aabcde,b=ab,則a有aabcde、abcde、bcde、cde、de、e這6個字尾子串,它們與b=ab的匹配長度分別是1、2、0、0、0、0。
因此a有4個位置與b的匹配長度恰好為0,有1個位置的匹配長度恰好為1,有1個位置的匹配長度恰好為2。
輸入格式
第一行輸入三個整數n,m,q,分別表示a串長度、b串長度、問題個數。
第二行輸入字串a,第三行輸入字串b。
接下來q行每行輸入1個整數x,表示乙個問題。
輸出格式
輸出共q行,依次表示每個問題的答案。
資料範圍
1≤n,m,q,x≤200000
輸入樣例:
6 2 5
aabcdeab0
1234
輸出樣例:41
100題解:雜湊值+二分法;
(ps:有為什麼輸入字串時不多預留一位會無輸出???qaq 如下錯誤**)
80分**
#include
#include
#include
#include
using namespace std;
unsigned
long
long f[
200005
],fb[
200005
],p[
200005];
int n,m,q,ans[
200005];
char a[
200005
],b[
200005];
interfen
(int be)
return r;
}int
main()
int x;
for(
int i=
1;i<=q;i++
)return0;
}
ac**
#include
#include
#include
#include
using namespace std;
unsigned
long
long f[
200005
],fb[
200005
],p[
200005];
int n,m,q,ans[
200005];
char a[
200005
],b[
200005];
interfen
(int be)
return r;
}int
main()
int x;
for(
int i=
1;i<=q;i++
)return0;
}
題解 CH1809 匹配統計
首先不難想到字串hash的做法,列舉a中的每個位置,二分匹配長度即可,時間複雜度 o n 很明顯正解應該要用kmp,但對於匹配出的乙個f i 我們只能知道 有一次長度至少為f i 的匹配 同時還可能會漏掉一些匹配位,怎麼辦?基於值域的字首和 即令cnt x 長度至少為x的匹配位的個數,易得答案等於c...
CH1809 匹配統計 KMP
求恰好匹配 x xx 長度比較困難,可以轉為求至少匹配 x xx 長度的位置,再作差。用kmp演算法可以求出每個位置最多匹配的長度,而這個長度其實是 於 nex t i nex t ne xt i next i next next i next i ne xt n ext i 因此對於他們,求至少匹...
題解 CH1809 匹配統計
首先不難想到字串hash的做法,列舉a中的每個位置,二分匹配長度即可,時間複雜度 o n 很明顯正解應該要用kmp,但對於匹配出的乙個f i 我們只能知道 有一次長度至少為f i 的匹配 同時還可能會漏掉一些匹配位,怎麼辦?基於值域的字首和 即令cnt x 長度至少為x的匹配位的個數,易得答案等於c...