Acwing 160 匹配統計

2021-09-25 12:22:31 字數 1647 閱讀 8760

阿軒在紙上寫了兩個字串,分別記為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...