扩展kmp模板

int a[S], b[S];

void getExtendNext(char *str)
{
    int id = 0, mx = 0;
    a[0] = n, a[1] = 0;
    for (int i = 1; i < n; i++)
    {
        if (mx > i + a[i - id])
        {
            a[i] = a[i - id];
            continue;
        }
        a[i] = max(mx - i, 0);
        while (str[i + a[i]] == str[a[i]])
            a[i]++;
        if (i + a[i] > mx)
            mx = i + a[i], id = i;
    }
}
void extendKmp(char *str, char *pat)
{
    getExtendNext(pat);
    int id = 0, mx = 0;
    memset(b, 0, sizeof (b));
    for (int i = 0; i < n; i++)
    {
        if (mx > i + a[i - id])
        {
            b[i] = b[i - id];
            continue;
        }
        b[i] = max(mx - i, 0);
        while ((i + b[i] < n) && pat[i + b[i]] == str[b[i]])
            b[i]++;
        if (i + b[i] > mx)
            mx = i + b[i], id = i;
    }
}


扩展kmp,a数组存的是pat串的所有后缀和pat串自身的最长公共前缀,b数组存的是pat串的所有后缀和str串的最长公共前缀。

思路和manacher有点像,利用前面已经匹配成功的包含了后面的来减少匹配次数。


你可能感兴趣的:(扩展kmp模板)