-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKMP_algorithm.cpp
More file actions
45 lines (40 loc) · 1.05 KB
/
KMP_algorithm.cpp
File metadata and controls
45 lines (40 loc) · 1.05 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
/// (KMP) Knuth Morris Pratt algorithm implementation in C language ///
#include <bits/stdc++.h>
using namespace std;
int failure_table[10000];
void failure_function (string pattern) {
int length_p = pattern.size();
int index = 1 , pslength = 0;
failure_table[0] = 0;
while (index < length_p) {
if (pattern[index] == pattern[pslength])
failure_table[index++] = ++pslength;
else {
if (pslength) pslength = failure_table[pslength - 1];
else failure_table[index++] = 0;
}
}
}
void KMP_matcher (string text , string pattern) {
int length_pt = pattern.size();
int length_tx = text.size();
int index_t , index_p;
index_t = index_p = 0;
while (index_t < length_tx) {
if (text[index_t] == pattern[index_p]) {
index_t++; index_p++;
if (index_p == length_pt)
printf ("A match is found at index %d \n" , index_t - length_pt);
}
else {
if (index_p) index_p = failure_table[index_p - 1];
else index_t++;
}
}
}
int main () {
string text , pattern;
cin >> text >> pattern;
failure_function (pattern);
KMP_matcher (text , pattern);
}