-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathZarray.cpp
More file actions
73 lines (68 loc) · 1.48 KB
/
Zarray.cpp
File metadata and controls
73 lines (68 loc) · 1.48 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//KMP - kmp[i] tells The longest proper prefix of pattern[0..i] which is also a suffix of pattern[0..i].
void preprocess_kmp(string &pattern, vector<int> &kmp)
{
kmp[0] = 0;
for (int i = 1; i < pattern.size(); i++)
{
kmp[i] = 0;
int length = kmp[i - 1];
while ((length > 0) && (pattern[i] != pattern[length]))
{
length = kmp[length - 1];
}
if (pattern[i] == pattern[length])
{
kmp[i] = length + 1;
}
}
}
// Z array - z[i] tells max length prefix starting from i
vll Zarray(string s)
{
ll n=s.size();
vll z(n,0); z[0]=n;
ll l=1, r=1;
for(ll i=1; i<n; i++)
{
if(i>=r) l=i, r=i;
ll x=i-l;
if(i+z[x]>=r)
{
l=i;
while(r<n && s[r]==s[r-l]) r++;
z[i]=r-i;
}
else z[i]=z[x];
}
return z;
}
// alterante implementation
vector<int> Zarray(string s)
{
int n = s.size();
vector<int> z(n,-1);
int L = 0, R = 0;
for(int i = 1; i < n; i++)
{
if(i > R)
{
L = R = i;
while (R < n && s[R-L] == s[R]) R++;
z[i] = R-L;
R--;
}
else
{
int k = i-L;
if(z[k] < R-i+1) z[i] = z[k];
else
{
L = i;
while (R < n && s[R-L] == s[R]) R++;
z[i] = R-L;
R--;
}
}
}
return z;
}