【模板】KMP

int n, m;
char a[MAX_N | 1];
char b[MAX_M | 1];
int p[MAX_M | 1];

inline void Init()
{
    p[0] = -1;
    for(register int i = 0, j = -1; i + 1 < m; ++i)
    {
        while(j >= 0 && b[i + 1] ^ b[j + 1]) j = p[j];
        if(b[i + 1] == b[j + 1]) ++j;
        p[i + 1] = j;
    }
    return;
}

inline void KMP()
{
    for(register int i = -1, j = -1; i + 1 < n; ++i)
    {
        while(j >= 0 && a[i + 1] ^ b[j + 1]) j = p[j];
        if(a[i + 1] == b[j + 1]) ++j;
        if(j + 1 == m) printf("%d\n", i - m + 3), j = p[j];
    }
    return;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章