KMP
Does pattern P exists in S?
int kmp(const string &S, const string &P) {
if (P.empty()) return 0;
vector<int> tab(P.size(), 0);
for (int i = 1, j = 0; i < P.size(); ++i) {
while (j && P[j] != P[i]) j = tab[j - 1];
if (P[j] == P[i]) ++j;
tab[i] = j;
}
for (int i = 0, j = 0; i < S.size(); ++i) {
while (j && P[j] != S[i]) j = tab[j - 1];
if (P[j] == S[i]) ++j;
if (j == P.size()) {
return i - j + 1;
/* below is the code to get all the pos
res.push_back(i-k+1);
k = tab[k-1];
*/
}
}
return -1;
}
int kmp(const string& S, const string& P) {
vector<int> tab(P.size() + 1); // 1-based to avoid extra checks.
for (auto i = 1, j = 0; i < P.size(); )
if (P[j] == P[i])
tab[++i] = ++j;
else if (j == 0)
tab[++i] = j;
else
j = tab[j];
for (auto i = 0, j = 0; i < S.size(); i += max(1, j - tab[j]), j = tab[j]) {
while (j < P.size() && S[i+j] == P[j]) ++j;
if (j == P.size())
return i;
}
return -1;
}
Last updated