-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathKMP.cpp
30 lines (29 loc) · 975 Bytes
/
KMP.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* len-failure[k]:
在k結尾的情況下,這個子字串可以由開頭
長度為(len-failure[k])的部分重複出現來表達
failure[k]為次長相同前綴後綴
如果我們不只想求最多,而且以0-base做為考量
,那可能的長度由大到小會是
failuer[k]、failure[failuer[k]-1]
、failure[failure[failuer[k]-1]-1]..
直到有值為0為止 */
int failure[MXN];
vector<int> KMP(string& t, string& p){
vector<int> ret;
if (p.size() > t.size()) return {};
for (int i=1, j=failure[0]=-1; i<p.size(); ++i){
while (j >= 0 && p[j+1] != p[i])
j = failure[j];
if (p[j+1] == p[i]) j++;
failure[i] = j;
}
for (int i=0, j=-1; i<t.size(); ++i){
while (j >= 0 && p[j+1] != t[i])
j = failure[j];
if (p[j+1] == t[i]) j++;
if (j == p.size()-1){
ret.push_back( i - p.size() + 1 );
j = failure[j];
}}
return ret;
}