var
s1,s2:ansistring;
len1,len2,i,k,st:longint;
next:array[0..10000111] of longint;
begin
readln(s1);
readln(s2);
len1:=length(s1);
len2:=length(s2);
next[0]:=-1;
for i:=2 to len2 do
begin
k:=i-1;
while (s2[i]<>s2[next[k]+1]) do
begin
k:=next[k];
if k=0 then break;
end;
next[i]:=next[k]+1;
end;
next[0]:=0;//建立next数组
i:=1;
st:=1;
while i<=len1 do
begin
if s1[i]=s2[st] then
begin
i:=i+1;
st:=st+1;
if st=len2+1 then
begin
st:=next[len2]+1;
writeln(i-len2);
end;
continue;
end;
if st=1 then i:=i+1;//1位置失配,i+1
st:=next[st-1]+1;
end;//匹配
for i:=1 to len2 do
write(next[i],' ');
end.
kmp模板
最新推荐文章于 2019-09-17 23:11:11 发布