SUBSTR – SPOJ

Đề bài: http://yeulaptrinh.de/319/substr-spoj/

Thuật toán:

  • (đang cập nhập)
  • Code:

    const
      fi='';
      fo='';
      maxn=trunc(1e6);
      base=trunc(1e9)+7;
      pp=307;
    var
      f : array[0..maxn] of int64;
      i,j,n,m : longint;
      hb : int64;
      a,b : array[1..maxn] of byte;
      ha,pow : array[0..maxn] of int64;
    procedure enter;
    var x : ansistring;
    begin
      assign(input,fi);reset(input);
      readln(x);
      m := length(x);
      for i := 1 to m do a[i] := ord(x[i])-48;
      readln(x);
      n := length(x);
      for i := 1 to n do b[i] := ord(x[i])-48;
      close(input);
    end;
    function gethash(l,r : longint) : int64;
    begin
      gethash := (ha[r]-ha[l-1]*pow[r-l+1] + base*base) mod base;
    end;
    procedure process;
    begin
      assign(output,fo);rewrite(output);
      ha[0] := 0;
      for i:=1 to m do ha[i] := (ha[i-1]*pp + a[i]) mod base;
      pow[0] := 1;
      for i:=1 to m do pow[i] := pow[i-1]*pp mod base;
      hb := 0;
      for i:=1 to n do hb := (hb*pp + b[i]) mod base;
      for i:=1 to m-n+1 do
        if hb = gethash(i,i+n-1) then
          write(i,' ');
      close(output);
    end;
    begin
      enter;
      process;
    end.
    

    Speak Your Mind

    *