KMP
next数组 表示:
next[i] -> T[1…i-1] 前缀 与 T[1…i-1] 后缀相同的最大长度
next[next[i]] 次大长度
扩展KMP
next数组 表示:
next[i]-> T[i….m] 与 T的最大公共前缀长度
extend[i] -> S[i….m] 与 T的最大公共前缀长度
next是T与T自身得到的特殊的extend
模板:
int next[MAXN];
int extend[MAXN];
void EKMP(char s[],char t[])//s[]为主串,t[]为模式串
{
int i,j,p,l;
int len=strlen(t);
int len1=strlen(s);
memset(next,0,sizeof(next));
memset(extend,0,sizeof(extend));
next[0]=len;
j=0;
while(j+1<len&&t[j]==t[1+j])j++;
next[1]=j;
int a=1;
for(int i=2;i<len;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<len&&t[i+j]==t[0+j])j++;
next[i]=j;
a=i;
}
}
j=0;
while(j<len1&&j<len&&s[j]==t[j])j++;
extend[0]=j;
a=0;
for(i=1;i<len1;i++)
{
p=extend[a]+a-1;
l=next[i-a];
if(l+i<p+1)next[i]=l;
else
{
j=max(0,p-i+1);
while(i+j<len1&&j<len&&s[i+j]==t[j])j++;
extend[i]=j;
a=i;
}
}
}
参考:ppt