procedure build_next;
begin
lena:=length(a);lenb:=length(b);
next[0]:=lenb;next[1]:=lenb-1;
for i:=1 to lenb-2 do if b[i]<>b[i+1] then
begin
next[1]:=i;break;
end;
k:=1;
for i:=2 to lenb-1 do
begin
p:=k+next[k]-1;L:=next[i-k];
if i+L<=p then next[i]:=L else
begin
j:=p-i+1;
if j<0 then j:=0;
while (i+j<lenb)and(a[i+j]=b[j]) do inc(j);
next[i]:=j;k:=i;
end;
end;
end;
procedure build_ex;
begin
if lena<lenb then minlen:=lena else minlen:=lenb;
ex[0]:=minlen;
for i:=1 to minlen-1 do if a[i]<>b[i] then
begin
ex[0]:=i;break;
end;
k:=0;
for i:=1 to lena-1 do
begin
p:=k+ex[k]-1;L:=next[i-k];
if i+L<=p then ex[i]:=L else
begin
j:=p-i+1;
if j<0 then j:=0;
while (i+j<lena)and(j<lenb)and(a[i+j]=b[j]) do inc(j);
ex[i]:=j;k:=i;
end;
end;
end;