kmp模板

    xiaoxiao2021-08-23  101

    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

    最新回复(0)