模板串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的字串,...