对于扩展kmp,现在还没有进行实用,所以先将模板打好基础,理解清楚每一步,这样日后应用就轻松点了。


对于这个模板,我觉得主要以理解扩展kmp为主,赛场实战的时候可以适当简化,这个模板对着 刘琼雅的 那个扩展kmp的ppt,可以很好的理解和吃透扩展kmp,每一步都可以对应到代码。如有不懂可以问本人。


刘琼雅ppt链接在文末。


下面贴码:

#include<iostream>
#include<cstring>
using namespace std;
const int MM=100005;

int next[MM],extand[MM];

char S[MM],T[MM];

void GetNext(const char *T) {
    int len = strlen(T),a = 0;

    next[0] = len;

    while(a < len - 1 && T[a] == T[a + 1]) a++;

    next[1] = a;
    a = 1;

    for(int k = 2; k < len; k ++) {

        int p = a + next[a] - 1,L = next[k - a];

        if( (k - 1) + L >= p) {

            int j = (p - k + 1) > 0 ? (p - k + 1) : 0;

            while(k + j < len && T[k + j] == T[j]) j++;

            next[k] = j;

            a = k;

        } else
            next[k] = L;
    }
}

void GetExtand(const char *S,const char *T) {
    GetNext(T);

    int slen = strlen(S),tlen = strlen(T),a = 0;

    int MinLen = slen < tlen ? slen : tlen;

    while(a < MinLen && S[a] == T[a]) a++;

    extand[0] = a;

    a = 0;

    for(int k = 1; k < slen; k ++) {

        int p = a + extand[a] - 1, L = next[k - a];

        if( (k - 1) + L >= p) {

            int j = (p - k + 1) > 0 ? (p - k + 1) : 0;

            while(k + j < slen && j < tlen && S[k + j] == T[j]) j ++;

            extand[k] = j;

            a = k;

        } else
            extand[k] = L;
    }
}
void show(const int *s,int len){

    for(int i = 0; i < len; i ++)
            cout << s[i] << ' ';
    cout << endl;
}

int main() {
    while(cin >> S >> T) {
        GetExtand(S,T);
        show(next,strlen(T));
        show(extand,strlen(S));
    }
    return 0;
}




http://wenku.baidu.com/view/fc9d8970f46527d3240ce072.html (刘琼雅扩展kmp ppt)