2013-team4/code/kmp

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
传入 pattern 串
kmp.get_fail(pattern, len);
在 text 中寻找
kmp.find(text, len);
}}}
{{{
const int MAXL = 100;

struct KMP{
    int fail[MAXL], m;
    const char *p;
    void get_fail(const char *p, int l){
        this->p = p; m = l;
        fail[0] = fail[1] = 0;
        for(int i = 1; i < l; i++){
            int j = fail[i];
            while(j != 0 && p[i] != p[j]) j = fail[j];
            fail[i + 1] = p[i] == p[j] ? j + 1 : 0;
        }
    }
    void find(const char *s, int l){
        for(int j = 0, i = 0; i < l; i++){
            while(j != 0 && s[i] != p[j]) j = fail[j];
            if(s[i] == p[j]) j++;
            if(j == m){
                j = fail[j];
                cout << "find at " << i - m + 1 << endl;
            }
        }
    }
};
}}}
传入 pattern 串
kmp.get_fail(pattern, len);
在 text 中寻找
kmp.find(text, len);
const int MAXL = 100;
struct KMP{
    int fail[MAXL], m;
    const char *p;
    void get_fail(const char *p, int l){
        this->p = p; m = l;
        fail[0] = fail[1] = 0;
        for(int i = 1; i < l; i++){
            int j = fail[i];
            while(j != 0 && p[i] != p[j]) j = fail[j];
            fail[i + 1] = p[i] == p[j] ? j + 1 : 0;
        }
    }
    void find(const char *s, int l){
        for(int j = 0, i = 0; i < l; i++){
            while(j != 0 && s[i] != p[j]) j = fail[j];
            if(s[i] == p[j]) j++;
            if(j == m){
                j = fail[j];
                cout << "find at " << i - m + 1 << endl;
            }
        }
    }
};