扩展KMP模板
Posted zjj0624
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展KMP模板相关的知识,希望对你有一定的参考价值。
扩展KMP
扩展KMP是一种解决字符串的数据结构,我们假设母串为S,长度为n,子串为T,长度为m,让我们求出所有S的后缀子串与T的最长公共前缀,也就是求出S(i,n)与T(1,m)的最长公共前缀,定义成一个数组就是
e
x
t
e
n
d
[
i
]
extend[i]
extend[i]
扩展KMP就是求这个extend[i].
具体extend的求法就不具体写了,这里只写求extend的模板.
模板
用到的数组
char T[N]; //子串
char S[N]; //母串
int next[N];//辅助数组next
int extend[N];//extend数组
求extend数组
void EXTEND_KMP ()
{
int lens = strlen (S);
int lent = strlen (T);
next[0] = lent;
int i, j, p, L;
j = 0;
while (j + 1 < lent && T[j] == T[j + 1])
{
++j;
}
next[1] = j;
int a = 1;
for (i = 2; i < lent; ++i)
{
p = next[a] + a - 1;
L = next[i - a];
if (i + L < p + 1)
{
next[i] = L;
}
else
{
j = max(0, p - i + 1);
while (i + j < lent && T[i + j] == T[j])
{
++j;
}
next[i] = j;
a = i;
}
}
j = 0;
while (j < lens && S[j] == T[j])
{
++j;
}
extend[0] = j;
a = 0;
for (i = 1; i < lens; ++i)
{
p = extend[a] + a - 1;
L = next[i - a];
if (L + i < p + 1)
{
extend[i] = L;
}
else
{
j = max(0, p - i + 1);
while (i + j < lens && j < lent && S[i + j] == T[j])
{
++j;
}
extend[i] = j;
a = i;
}
}
}
以上是关于扩展KMP模板的主要内容,如果未能解决你的问题,请参考以下文章