On this page
article
KMP
Sobre
matching(s, t) retorna os indices das ocorrencias
de s em t
autKMP constroi o automato do KMP
Complexidades:
pi - O(n)
match - O(n + m)
construir o automato - O(|sigma|*n)
n = |padrao| e m = |texto|
Link original: kmp.cpp
Código
template<typename T> vector<int> pi(T s) {
vector<int> p(s.size());
for (int i = 1, j = 0; i < s.size(); i++) {
while (j and s[j] != s[i]) j = p[j-1];
if (s[j] == s[i]) j++;
p[i] = j;
}
return p;
}
template<typename T> vector<int> matching(T& s, T& t) {
vector<int> p = pi(s), match;
for (int i = 0, j = 0; i < t.size(); i++) {
while (j and s[j] != t[i]) j = p[j-1];
if (s[j] == t[i]) j++;
if (j == s.size()) match.push_back(i-j+1), j = p[j-1];
}
return match;
}
struct KMPaut : vector<vector<int>> {
KMPaut(){}
KMPaut (string& s) : vector<vector<int>>(26, vector<int>(s.size()+1)) {
vector<int> p = pi(s);
auto& aut = *this;
aut[s[0]-'a'][0] = 1;
for (char c = 0; c < 26; c++)
for (int i = 1; i <= s.size(); i++)
aut[c][i] = s[i]-'a' == c ? i+1 : aut[c][p[i-1]];
}
};