void getNext(string s, vector<int>& next) {
next[0] = 0;
int p_len = s.length();
int i = 1;
int j_len = 0;
for (; i < p_len; i++) {
while (j_len > 0 && s[j_len] != s[i]) {
j_len = next[j_len];
}
if (s[i] == s[j_len]) {
j_len++;
}
next[i] = j_len;
}
}
vector<int> kmp(const string s, const string p){
vector<int > result;
int s_len = s.length();
int p_len = p.length();
vector<int> next(p_len);
getNext(p, next);
int p_index = 0;
for (int i = 0; i < s_len; i++) {
while (p_index > 0 && p[p_index] != s[i]) {
p_index = next[p_index - 1];
}
if (s[i] == p[p_index]) {
p_index++;
}
if (p_index == p_len) {
result.push_back(i);
p_index = next[p_index - 1];
}
}
return result;
}