-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathkmp.cpp
112 lines (97 loc) · 2.14 KB
/
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//template by chamow
#include<bits/stdc++.h>
/*-------------------------------------------------------- */
using namespace std;
/*-------------------------------------------------------- */
#define rep(i,val,n) for(ll i=val;i<n;i++)
#define per(j,val,n) for(ll j=val;j>=n;j--)
#define pb push_back
#define pi 3.14157
#define mp make_pair
#define MODULO 1000000007
#define INF 1000000000000000
#define fastread ios_base::sync_with_stdio(false); cin.tie(NULL);
/*-------------------------------------------------------- */
typedef long long ll;
typedef vector<bool> boolean;
typedef vector<ll> vec;
/*-------------------------------------------------------- */
ll gcd(ll a, ll b)
{
if(b == 0)
{
return a;
}
return gcd(b, a%b);
}
ll lcm(ll a, ll b)
{
return ((a*b)/gcd(a,b));
}
void computeLPS(string pattern, vec &lps, ll m);
void KMP(string text, string pattern)
{
ll n = text.length();
ll m = pattern.length();
vec lps(m,0);
computeLPS(pattern, lps, m);
ll i = 0, j = 0;
while(i < n)
{
if(text[i] == pattern[j])
{
i++;
j++;
}
if(j == m)
{
cout<<"Pattern found at: "<<i-j<<'\n';
j = lps[j-1];
}
else if(i < n && pattern[j] != text[i])
{
if(j != 0)
{
j = lps[j-1];
}
else
{
i = i + 1;
}
}
}
}
void computeLPS(string pattern, vec &lps, ll m)
{
ll len = 0;
lps[0] = 0;
ll i = 1;
while(i < m)
{
if(pattern[i] == pattern[len])
{
len++;
lps[i] = len;
i++;
}
else if(pattern[i] != pattern[len] && len != 0)
{
len = lps[len-1];
}
else
{
lps[i] = 0;
++i;
}
}
}
/*-------------------------------------------------------- */
int main()
{
fastread;
string text, pattern;
cin>>text;
cin>>pattern;
KMP(text, pattern);
return 0;
}