http://unbelievable.ycool.com/post.1020602.html
其实 next 的 求法和 extend一样 不过 如果 S<>T 时 开始条件 有些不一样.. 不过 没有关系啦 ... 还是写两遍的好 !!!!
p —— 以前 匹配的 最远位置
a —— 第a个位置 时 匹配到最远
l —— 当前位置的 next 值
|
program extend_kmp;
var a , p, i, l : longint;
begin
a:=0; p:=0; next[0]:=0; next[1]:=len;
for i:=2 to len do begin
l:=next[i-a+1];
if l+i-1>p then l:=p+1-i;
if l<0 then l:=0;
while (l+i<=len) and (t[l+1]=t[l+i]) do inc(l);
next[i]:=l;
if l+i>p then begin p:=i+l-1; a:=i end;
end;
a:=0; p:=0; extend[0]:=0;
for i:=1 to len do begin
l:=next[i-a+1];
if l+i-1>p then l:=p+1-i;
if l<0 then l:=0;
while (l+i<=len) and (l+1<=lt) and (s[l+1]=t[l+i]) do inc(l);
extend[i]:=l;
if l+i>p then begin p:=l+i-1; a:=i end;
end;
end;
|