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.
转载请注明原文地址: https://ju.6miu.com/read-676927.html