跳转至

kmp

Note
int kmp(char s[], char c[])
{
    int n = -1, m = -1, i, j;
    while (s[++ n]); while (c[++ m]);
    vector<int> ne(m + 1, 0);
    i = -1, j = 0, ne[0] = -1;
    while (j < m)
    {
        if (i == -1 || c[i] == c[j])
        {
            i ++, j ++; ne[j] = i;
        }
        else i = ne[i];
    }
    i = 0, j = 0;
    while (i < n && j < m)
    {
        if (j == -1 || s[i] == c[j]) i ++, j ++;
        else j = ne[j];
    }
    if (j == m) return i - j;
    else return -1;
}