扩展kmp

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;




posted @ 2008-12-05 15:34  jesonpeng  阅读(340)  评论(0)    收藏  举报