扩展kmp模板

来源:互联网 发布:office批量打印软件 编辑:程序博客网 时间:2024/06/05 09:42
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有点像,利用前面已经匹配成功的包含了后面的来减少匹配次数。