kmp & exkmp template

km²

inline void calc_next () { // Calculation of a next array pattern string starts from a 
    next [ 1 ] = 0 ;
     for ( int I = 2 , J = 0 ; I <= n-; ++ I) {
         the while (J> 0 ! && A [I] = A [+ J . 1 ]) = J Next [J];
         IF (A [I] == A [+ J . 1 ]) J ++ ; 
        Next [I] = J; 
    } 
}
inline void calc_f() { // kmp b为主串 从1开始
    for (int i = 1, j = 0; i <= m; ++ i) {
        while (j > 0 && (j == n || b[i] != a[j + 1])) j = next[j];
        if (b[i] == a[j + 1]) j ++;
        f[i] = j;
        if (f[i] == n) {/* the first time */}
    }
}

 

exkmp

// find a prefix on the longest common suffix b's, Next recording a longest common prefix each on its own suffix, ret recorded on a longest common prefix of suffix b 
void ExtendedKMP ( char * a, char * b , int M, int N, int * the Next, int * RET) {
     int I, J, K;
     for (J = 0 ; . 1 + J <M && A [J] == A [ . 1 + J]; ++ J); 
    the Next [ . 1 ] = J; 
    K = . 1 ;
     for (I = 2 ; I <M; ++ I) {
         int Len = k + Next[k], L = Next[i - k];
        if (L < Len - i) {
            Next[i] = L;
        } else {
            for (j = max(0, Len - i); i + j < M && a[j] == a[i + j]; ++ j);
            Next[i] = j;
            k = i;
        }
    }
    for (j = 0; j < N && j < M && a[j] == b[j]; ++ j);
    ret[0] = j;
    k = 0;
    for (i = 1; i < N; ++ i) {
        int Len = k + ret[k], L = Next[i - k];
        if (L < Len - i) {
            ret[i] = L;
        } else {
            for (j = max(0, Len - i); j < M && i + j < N && a[j] == b[i + j]; ++ j);
            ret[i] = j;
            k = i;
        }
    }
}

 

Guess you like

Origin www.cnblogs.com/ertuan/p/11360823.html