(* Baseline: count anagram groups using Hashtbl + sort *) (* Sort the chars in a string to get its anagram-equivalence key *) let canonical s = let n = String.length s in let chars = ref [] in for i = 0 to n - 1 do chars := (String.get s i) :: !chars done ; let sorted = List.sort compare !chars in String.concat "" sorted ;; let count_groups words = let counts = Hashtbl.create 16 in List.iter (fun w -> let k = canonical w in match Hashtbl.find_opt counts k with | None -> Hashtbl.add counts k 1 | Some n -> Hashtbl.replace counts k (n + 1)) words ; Hashtbl.length counts ;; count_groups ["eat"; "tea"; "tan"; "ate"; "nat"; "bat"]