Advertisement
Guest User

Kody 1

a guest
Jan 15th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.90 KB | None | 0 0
  1. OCAML - Kody użytecznych rzeczy
  2.  
  3. (* NWD *)
  4. let rec nwd a b =
  5.     if b = 0 then a else gcd b (a mod b);;
  6.  
  7. (* NWW *)
  8. let nww a b = (a*b)/(nwd a b);;
  9.  
  10.  
  11.  
  12. (** Binsearch + KMP, credits - Marcin Kurowski **)
  13.  
  14. (* pierwsza potega 2 wieksza od x *)
  15. let rec pot x wyn =
  16.   if x > 0
  17.   then pot (x/2) wyn*2
  18.   else wyn
  19.  
  20. (* znajduje indeks ostatniej liczby mniejszej badz rownej x *)
  21. let binsearch tab x =
  22.   let pocz = ref (-1) in
  23.   let ws = ref (pot (length tab) 1) in
  24.   while !ws != 0 do
  25.     let sr = ((!pocz) + (!ws)) in
  26.     if sr < (length tab) && tab.(sr) <= x
  27.     then (
  28.       pocz := sr;
  29.       ws := (!ws) / 2
  30.       )
  31.     else ws := (!ws) / 2
  32.   done;
  33.   !pocz;;
  34.  
  35. (* znajduje indeks ostatniej liczby mniejszej od x *)
  36.   let binsearch_mn tab x =
  37.   let pocz = ref (-1) in
  38.   let ws = ref (pot (length tab) 1) in
  39.   while !ws != 0 do
  40.   let sr = ((!pocz) + (!ws)) in
  41.   if sr < (length tab) && tab.(sr) < x
  42.   then (
  43.     pocz := sr;
  44.     ws := (!ws) / 2
  45.     )
  46.     else ws := (!ws) / 2
  47.   done;
  48.   !pocz;;
  49.  
  50.  
  51. (*KMP Credits Marcin Kurowski*)
  52.  
  53. open Array
  54.  
  55. let kmp slowo wzorzec =
  56.   let calosc = make ((length slowo) + (length wzorzec) + 5) "" in
  57.   for i = 0 to (length wzorzec) - 1 do
  58.     calosc.(i) <- wzorzec.(i)
  59.   done;
  60.   for i = (length wzorzec) + 1 to (length wzorzec) + (length slowo) do
  61.     calosc.(i) <- slowo.(i - (length wzorzec) - 1)
  62.   done;
  63.   calosc.(length wzorzec) <- "#";
  64.   let dl = (length wzorzec) + (length slowo) + 1 in
  65.   let odp = make (dl) 0 in
  66.   for i = 1 to (dl - 1) do
  67.     if calosc.(odp.(i-1)) = calosc.(i)
  68.     then odp.(i) <- odp.(i-1) + 1
  69.     else (
  70.         let k = ref odp.(i-1) in
  71.         let ok = ref 1 in
  72.         while !k != (-1) && !ok = 1 do
  73.           if calosc.(i) = calosc.(!k)
  74.           then (
  75.             odp.(i) <- (!k) + 1;
  76.             ok := 0;
  77.           );
  78.           (if !k = 0 then ok := 0);
  79.           k := odp.(!k);
  80.         done
  81.       )
  82.   done;
  83.   odp;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement