#include<bits/stdc++.h>
#define ll long long
// return a vector, which contains all indexes that pattern is found in base
template <typename T> vector<int> KMP (T &base, int base_size, T &pattern, int pattern_size) {
vector<int> kmp; // vector contains all position i that pattern can be found in base
int *lps = new int[pattern_size];
// pre-process to fill lps
int past_len = 0;
lps[0] = 0;
for (int i = 1; i < pattern_size;) {
if (pattern[i] == pattern[past_len]) {
lps[i] = past_len+1;
i++; past_len++;
}
else {
if (past_len > 0) {
past_len = lps[past_len-1];
}
else {
lps[i] = 0;
i++;
}
}
}
// search for pattern in base
for (int i = 0, j = 0; i < base_size;) {
while(i < base_size && j < pattern_size && base[i] == pattern[j])
i++, j++;
if (j == pattern_size) {
kmp.push_back(i-pattern_size);
j = lps[j-1];
continue;
}
if (i == base_size)
break;
if (j != 0)
j = lps[j-1];
else
i++;
}
return kmp;
}