// Prefix that matches any substring of the string
// Largest prefix that matches a suffix
vector<int> kmp(string s) {
vector<int> lps(s.size(), 0);
for (int i = 1; i < s.size(); i++) {
int prev_idx = lps[i - 1];
while (prev_idx > 0 && s[i] != s[prev_idx]) {
prev_idx = lps[prev_idx - 1];
}
if (s[i] == s[prev_idx]) {
prev_idx++;
}
lps[i] = prev_idx;
}
return lps;
}
vector<int> kmp_search(string text, string pattern) {
string combined = pattern + "#" + text;
vector<int> lps = kmp(combined);
vector<int> res;
int m = pattern.size();
for (int i = m + 1; i < lps.size(); i++) {
if (lps[i] == m) {
res.push_back(i - 2 * m);
}
}
return res;
}