int nxt(string& p, vector<int>& nbor, int lider, char c) {
// vamos tentar avancar o lider alimentando o caractere c
// no automato
// enquanto lider nao for o inicial
while(lider != -1) {
// se o lider tem o caractere c, avanca ele
// caso contrario, a thread morre e vc tem que olhar o vizinho do lider
}
// se todo mundo morreu e o lider eh -1, o que acontece?
}
vector<int> kmp(string p) {
int n = p.size(); vector<int> nbor(p.size()); // nbor[i] retorna
// a primeira thread de i pra esquerda que ta viva
nbor[0] = -1; // -1 eh a thread inicial sem
// matching algum
for(int i = 1; i < n; i++) {
// quem eh o vizinho do i antes de processar o caractere p[i]?
nbor[i] = // ?
nbor[i] = nxt(p, nbor, nbor[i], p[i]);
}
return nbor
}