AcWing 831 KMP字串(C 演算法)

2021-10-08 10:34:11 字數 959 閱讀 3424

模板串p在模式串s中多次作為子串出現。

求出模板串p在模式串s中所有出現的位置的起始下標。

輸入格式

第一行輸入整數n,表示字串p的長度。

第二行輸入字串p。

第三行輸入整數m,表示字串s的長度。

第四行輸入字串s。

輸出格式

共一行,輸出所有出現位置的起始下標(下標從0開始計數),整數之間用空格隔開。

資料範圍

1≤n≤105

1≤m≤106

輸入樣例:

3aba

5ababa

輸出樣例:

0 22、基本思想:

為了降低時間複雜度,要求先試探 j 後面那個數,當p[j + 1]與s[i]不匹配時,j 最少要退幾步也就是 j 最多能從p的第幾個數開始再重新與s匹配。這就需要求這個「幾」,把ne當作這個「幾」,求出n個ne的值即可。

#include

using

namespace std;

const

int n =

100010

, m =

1000010

;char p[n]

, s[m]

;int n, m;

int ne[n]

;int

main()

//求next陣列

for(

int i =

1, j =

0; i <= m; i ++)}

//匹配

return0;

}//該**引用acwing**的**

注意事項:

①p, s下標都從1開始

②題中指出輸出最後下標的時候要從零開始,所以最後輸出時不用+1

③兩個for迴圈當中i,j總是錯一位

④第乙個for迴圈當中i從2開始是因為ne[1]一定是等於0的,不用算。

AcWing 831 KMP字串(模板)

給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸入整數n,表示字串p的長度。第二行輸入字串p。第三行輸入整數m,表示字串s的長度。第四行輸入字串m。輸出格式 共...

AcWing刷題 KMP字串(經典)

給定乙個模式串 s s 以及乙個模板串 p p 所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串 p s p 在模式串 s 中多次作為子串出現。求出模板串 p s p s 在模式串 s 中所有出現的位置的起始下標。輸入格式 第一行輸入整數 ns p s s 表示字串 p 的長度。第二行輸入字串 ...

AcWing 字串雜湊 字串查詢

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