Guest User

Untitled

a guest
Jan 16th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. let p = 997
  2. let q = 1000000007
  3.  
  4. let potegi = Array.make 1000005 0;;
  5. begin
  6. potegi.(0) <- 1;
  7. for i = 1 to 1000000 do
  8. potegi.(i) <- (potegi.(i-1) * p) mod q;
  9. done
  10. end
  11.  
  12. let hasze = (Array.make 1000000 0)
  13. let dlugosc = ref 0
  14.  
  15. let licz_hasze slowo = begin
  16. dlugosc := Array.length slowo;
  17. hasze.(0) <- Char.code slowo.(0);
  18. for i = 1 to !dlugosc - 1 do
  19. hasze.(i) <- (hasze.(i - 1) * p + Char.code slowo.(i)) mod q;
  20. done;
  21. end
  22.  
  23. let hasz_wzorca wzorzec =
  24. let wyn = ref (Char.code wzorzec.(0)) in
  25. let len = Array.length wzorzec in
  26. for i = 1 to len - 1 do
  27. wyn := (!wyn * p + Char.code wzorzec.(i)) mod q;
  28. done;
  29. !wyn
  30.  
  31. let hasz_przedzialu i j =
  32. if i = 0 then hasze.(j)
  33. else (q + hasze.(j) - (hasze.(i - 1) * potegi.(j - i + 1)) mod q) mod q;;
  34.  
  35. let licz_wzorce wzorzec =
  36. let wzorzec_hasz = hasz_wzorca wzorzec in
  37. let i = ref 0 in
  38. let j = ref (Array.length wzorzec - 1) in
  39. let wynik = ref 0 in
  40. while !j <= !dlugosc - 1 do
  41. (if hasz_przedzialu !i !j = wzorzec_hasz then wynik := !wynik + 1
  42. else ());
  43. i := !i + 1;
  44. j := !j + 1;
  45. done;
  46. !wynik;;
Add Comment
Please, Sign In to add comment