Skip to content

Commit 6c0b581

Browse files
authored
Create KMP Search.cpp
1 parent de81f05 commit 6c0b581

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

KMP Search.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// KMP algorithm for pattern searching in O(n+m)
2+
#include <bits/stdc++.h>
3+
#include <ext/rope>
4+
using namespace std;
5+
using namespace __gnu_cxx;
6+
7+
using ci = const int;
8+
using ld = long double;
9+
using llint = long long;
10+
using ullint = unsigned long long;
11+
using pii = pair <int,int>;
12+
using pcc = pair <char,char>;
13+
using pss = pair <string,string>;
14+
using vi = vector <int>;
15+
using vb = vector <bool>;
16+
using vii = vi::iterator;
17+
18+
#define INF (1<<30)
19+
#define MOD 1000000007
20+
#define mp make_pair
21+
#define mt make_tuple
22+
#define all(c) c.begin(), c.end()
23+
#define ms(name,val) memset(name, val, sizeof name)
24+
#define np nullptr
25+
26+
27+
int n, m;
28+
string t, p;
29+
vi tmp;
30+
31+
void buildArray()
32+
{
33+
tmp.resize(m);
34+
int i = 0, j = 1;
35+
36+
while (j < m)
37+
{
38+
while (i > 0 && p[i] != p[j])
39+
i = tmp[i-1];
40+
41+
if (p[i] == p[j])
42+
{
43+
tmp[j] = i+1;
44+
++i, ++j;
45+
}
46+
else ++j;
47+
}
48+
}
49+
50+
void KMP_Search()
51+
{
52+
int i = 0, j = 0;
53+
54+
while (i < n)
55+
{
56+
while (j > 0 && t[i] != p[j])
57+
j = tmp[j-1];
58+
59+
if (t[i] == p[j])
60+
{
61+
++i;
62+
++j;
63+
64+
if (j == m)
65+
cout << i-m << '\n';
66+
}
67+
else ++i;
68+
}
69+
}
70+
71+
int main()
72+
{
73+
ios_base::sync_with_stdio(0);
74+
//cin.tie(0);
75+
76+
cin >> t >> p;
77+
n = t.size();
78+
m = p.size();
79+
buildArray();
80+
KMP_Search();
81+
82+
83+
84+
return 0;
85+
}

0 commit comments

Comments
 (0)