【拓展KMP算法】知识点讲解+模板




void getnext() {
    next[1] = n;
    int p = 1;
    while(p < n && t[p] == t[p + 1]) p++;
    next[2] = p-1;
    int k = 2,l;
    for(int i = 3; i <= n; i++) {
        p = k + next[k] - 1;
        l = next[i - k + 1];
        if (i + l <= p) next[i] = l;
        else {
            int j = p - i + 1;
            if(j < 0)     j = 0;
            while(i + j <= n && t[i + j] == t[j + 1])     j++;
            next[i] = j;
            k = i;
        }
    }
}



void getextend() {
    int p = 0;
    while (p < m && p < n && s[p + 1] == t[p + 1]) {
        p++;
    }
    extend[1] = p;
    int k = 1, l;
    for (int i = 2; i <= m; i++) {
        p = k + extend[k] - 1;
        l = next[i - k + 1];
        if (i + l <= p) {
            extend[i] = l;
        } else {
            int j = p - i + 1;
            if(j < 0) j = 0;
            while(i + j <= m && j + 1 <=n && s[i + j] == t[j + 1])    j ++;
            extend[i] = j;
            k = i;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/80284568