-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkmp.cpp
More file actions
59 lines (49 loc) · 1.3 KB
/
Copy pathkmp.cpp
File metadata and controls
59 lines (49 loc) · 1.3 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
int kmp[M+2 ] ;
string text ;
void generatefail(string s ) {
rep(i , sz(s) ) kmp[i]= 0;
forn(i,2, sz(s ) -1) {
int curr = kmp[i-1] ;
while(curr >0 and s[i]!= s[curr+1 ]) {
curr = kmp[curr ] ;
}
if(s[i] == s[curr+1] ) ++curr ;
kmp[i] = curr ;
}
}
int match( string s ) {
int curr= 0 ,cnt = 0 , k = sz(text )-min(sz(text) , sz(s) ) ;
s = "0"+ s;
generatefail(s) ;
forn(i , k , sz(text) -1 ) {
while(curr>0 and s[curr+1 ]!= text[i] )
curr = kmp [curr ] ;
if(s[curr+1 ] == text[i] ) curr++ ;
}
return curr ;
}
///// another implementation
https://codeforces.com/blog/entry/66943 problem d
void init(char s[], int n, int kmp[], int nxt[][26])
{
kmp[1] = 0;
for (int i = 2; i <= n; i++)
{
int cur = kmp[i - 1];
while (cur > 0 && s[cur + 1] != s[i])
cur = kmp[cur];
if (s[cur + 1] == s[i])
++cur;
kmp[i] = cur;
}
for (int i = 0; i <= n; i++)
for (char c = 'a'; c <= 'z'; c++)
{
int cur = i;
while (cur > 0 && s[cur + 1] != c)
cur = kmp[cur];
if (s[cur + 1] == c)
++cur;
nxt[i][c - 'a'] = cur;
}
}