This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
array<int,26> bm_build_skip(string const & pattern) { // O(m)
int m = pattern.length();
array<int,26> skip = {};
repeat (i,m) skip[pattern[i]-'a'] = m-i-1;
return skip;
}
vector<int> bm_build_next(string const & pattern) { // O(m)
int m = pattern.length();
int g[m]; fill(g, g+m, m);
vector<int> next(m);
repeat (i,m) next[i] = 2*m-i-1;
int j = m;
for (int i = m-1; i >= 0; --i, --j) {
g[i] = j;
while (j < m and pattern[j] != pattern[i]) {
next[j] = min(next[j], m-i-1);
j = g[j];
}
}
repeat (i,m) {
next[i] = min(next[i], j+m-i);
if (i >= j) j = g[j];
}
return next;
}
int bm_match(string const & target, string const & pattern, array<int,26> const & skip, vector<int> const & next) { // O(nm)
int n = target.length();
int m = pattern.length();
int result = 0;
for (int i = m-1; i < n; ) {
int j = m-1;
while (j >= 0 and target[i] == pattern[j]) { --i; --j; }
if (j < 0) {
++ result; // match at text[i+1, ..., i+m]
i += m + 1;
} else {
i += max(skip[target[i]-'a'], next[j]);
}
}
return result;
}
int bm_match(string const & target, string const & pattern) { // Boyer-Moore
return bm_match(target, pattern, bm_build_skip(pattern), bm_build_next(pattern));
}
#line 1 "old/boyer-moore.inc.cpp"
array<int,26> bm_build_skip(string const & pattern) { // O(m)
int m = pattern.length();
array<int,26> skip = {};
repeat (i,m) skip[pattern[i]-'a'] = m-i-1;
return skip;
}
vector<int> bm_build_next(string const & pattern) { // O(m)
int m = pattern.length();
int g[m]; fill(g, g+m, m);
vector<int> next(m);
repeat (i,m) next[i] = 2*m-i-1;
int j = m;
for (int i = m-1; i >= 0; --i, --j) {
g[i] = j;
while (j < m and pattern[j] != pattern[i]) {
next[j] = min(next[j], m-i-1);
j = g[j];
}
}
repeat (i,m) {
next[i] = min(next[i], j+m-i);
if (i >= j) j = g[j];
}
return next;
}
int bm_match(string const & target, string const & pattern, array<int,26> const & skip, vector<int> const & next) { // O(nm)
int n = target.length();
int m = pattern.length();
int result = 0;
for (int i = m-1; i < n; ) {
int j = m-1;
while (j >= 0 and target[i] == pattern[j]) { --i; --j; }
if (j < 0) {
++ result; // match at text[i+1, ..., i+m]
i += m + 1;
} else {
i += max(skip[target[i]-'a'], next[j]);
}
}
return result;
}
int bm_match(string const & target, string const & pattern) { // Boyer-Moore
return bm_match(target, pattern, bm_build_skip(pattern), bm_build_next(pattern));
}