open String;; let read = open_in "file.txt";; let rec reading s = s ^ "\n" ^ (input_line read);; let read_text () = let rec read_text' s = try read_text' (reading s) with End_of_file -> s in try read_text' (input_line read) with End_of_file -> "";; let m = read_text ();; let soc c = make 1 c;; let max_s s = let l = length s in let b = ref (0, "") in let rec f n = if n > 0 then (b := (0, ""); for i = 0 to (n - 1) do if s.[i] = s.[l - n + i] then b := ((fst !b) + 1, (snd !b) ^ (soc s.[i])) done; if (fst !b) < n then f (n - 1) else Some (snd !b)) else None in f (l - 1);; let max_s2 s = let l = length s in let b = ref 0 in let rec f n = if n > 0 then (b := 0; for i = 0 to (n - 1) do if s.[i] = s.[l - n + i] then b := !b + 1 done; if !b < n then f (n - 1) else !b) else 0 in f (l - 1);; let rec apply str avt = (*let b = ref 0 in*) let l = length str in let l2 = Array.length avt in let rec f s i = if i < l then (let c = avt.(s).(int_of_char str.[i]) in if c = l2 then ((i - c + 1), c) else f c (i + 1)) else (0,0) in f 0 0;; let str' s n = let k = ref "" in for i = 0 to (n - 1) do k := !k ^ (soc s.[i]) done; !k;; let getavt s = let l = length s in let avt = Array.create_matrix l 256 (0, 0) in for i = 0 to l - 1 do let s' = str' s i in for j = 0 to 255 do if s.[i] = '?' then avt.(i).(j) <- i + 1 else (let s2 = s' ^ (soc (char_of_int j)) in if s2 = (str' s (i + 1)) then avt.(i).(j) <- i + 1 else avt.(i).(j) <- (max_s2 s2)) done done; avt;; let b = getavt "aaa?";; let c = getavt "ª¥ä¨à";; let a = Array.init 3 (fun x -> Array.init 256 (fun y -> 0));; a.(0).(97) <- 1;; a.(1).(97) <- 1;; a.(2).(97) <- 1;; a.(1).(98) <- 2;; a.(2).(99) <- 3;; (*print_int b.(0).(97) ;; print_int b.(1).(97) ;; print_int b.(2).(97) ;; print_int b.(3).(97) ;; print_int b.(2).(98) ;; print_int b.(3).(99) ;; print_int b.(0).(63) ;; print_int b.(1).(63) ;; print_int b.(2).(63) ;; print_int b.(3).(63) ;; *) (*match max_s "ababa" with Some x -> print_string (x ^ "\n") |None -> print_string "none\n";; print_int (max_s2 "ababa");; print_string "\n";; print_int (apply "a2abcxcacabcbv" a);; print_string "\n";; *) let s = "aab" in let n = apply s b in let m = length s in print_string ((sub s 0 (fst n)) ^ "<" ^ (sub s (fst n) (snd n)) ^ ">" ^(sub s ((fst n) + (snd n)) (m - (fst n) - (snd n))));; (*print_string "\n";; print_int (apply m c);; *)