Submission #3195742


Source Code Expand

module DirectedGraph
  (Vertex : sig
    type t
    val compare : t -> t -> int
  end) :
sig
  (* トポロジカルソート *)
  val sort :
    (* 頂点のリスト *)
    Vertex.t list ->
    (* 隣接リスト *)
    (Vertex.t -> Vertex.t list) ->
    Vertex.t list

  (* 強連結成分分解 *)
  val scc :
    (* 頂点のリスト *)
    Vertex.t list ->
    (* 隣接リスト *)
    (Vertex.t -> Vertex.t list) ->
    Vertex.t list list
end =
struct
  module VSet = Set.Make (Vertex)

  let rec visit es v (vs, l) =
    if VSet.mem v vs then
      let (vs', l') =
        List.fold_right (visit es) (es v) (VSet.remove v vs, l) in
      (vs', v :: l')
    else (vs, l)

  let sort vs es =
    snd (List.fold_right (visit es) vs (VSet.of_list vs, []))

  let scc vs es =
    sort vs es
    |> List.rev
    |> List.fold_left (fun (vs, l) v ->
        if VSet.mem v vs then 
          let (vs', cs) = visit es v (vs, []) in
          (vs', cs :: l)
        else (vs, l)) (VSet.of_list vs, [])
    |> snd
end

module Int = struct
  type t = int
  let compare = compare
end
module G = DirectedGraph (Int)
module IntMap = Map.Make (Int)

let () = Scanf.scanf "%d %d %d\n" @@ fun n m k ->
  let cs = Array.init n @@ fun _ ->
    Scanf.scanf "%c " @@ fun c -> c in
  let es = Array.make n [] in
  for i = 0 to m - 1 do
    Scanf.scanf "%d %d\n" @@ fun a b ->
      es.(a - 1) <-  b - 1 :: es.(a - 1)
  done;
  let scc =
    Array.of_list @@
    G.scc (Array.to_list @@ Array.init n @@ fun v -> v) (Array.get es) in
  let group = Array.make n 0 in
  Array.iteri (fun i -> List.iter (fun v -> group.(v) <- i)) scc;
  let rec dp i =
    List.fold_right (fun c m ->
      IntMap.fold (fun i s m ->
        IntMap.add (i + 1)
          ( try min (c :: s) (IntMap.find (i + 1) m)
            with Not_found -> c :: s ) m) m m)
    (List.sort compare (List.rev_map (Array.get cs) scc.(i))) @@
    List.fold_left (IntMap.merge (fun _ xs ys ->
      match xs, ys with
      | None, _ -> ys
      | _, None -> xs
      | Some x, Some y -> Some (min x y))) (IntMap.singleton 0 []) @@
    List.rev_map dp @@
    List.filter (( < ) i) @@
    List.sort_uniq compare @@
    List.concat @@
    List.rev_map (fun v -> List.rev_map (Array.get group) es.(v)) scc.(i) in
  try List.iter print_char (IntMap.find k (dp 0)); print_newline ()
  with Not_found -> print_endline "-1"

Submission Info

Submission Time
Task C - 有向グラフ
User fetburner
Language OCaml (4.02.3)
Score 0
Code Size 2446 Byte
Status WA
Exec Time 88 ms
Memory 6016 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 100
Status
AC × 4
AC × 28
WA × 4
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt
All subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt, subtask1_manual01.txt, subtask1_manual02.txt, subtask1_manual03.txt, subtask1_manual04.txt, subtask1_manual05.txt, subtask1_manual06.txt, subtask1_manual07.txt, subtask1_manual08.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_special01.txt, subtask1_special02.txt, subtask1_special03.txt, subtask1_special04.txt, subtask1_special05.txt, subtask1_special06.txt, subtask1_special07.txt, subtask1_special08.txt, subtask1_special09.txt, subtask1_special10.txt, subtask1_special11.txt, subtask1_special12.txt, subtask1_special13.txt, subtask1_special14.txt, subtask1_special15.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 1 ms 384 KB
subtask0_sample_02.txt AC 1 ms 384 KB
subtask0_sample_03.txt AC 1 ms 384 KB
subtask0_sample_04.txt AC 1 ms 384 KB
subtask1_manual01.txt AC 1 ms 384 KB
subtask1_manual02.txt AC 1 ms 384 KB
subtask1_manual03.txt AC 1 ms 384 KB
subtask1_manual04.txt AC 1 ms 384 KB
subtask1_manual05.txt AC 1 ms 384 KB
subtask1_manual06.txt AC 1 ms 384 KB
subtask1_manual07.txt AC 1 ms 384 KB
subtask1_manual08.txt AC 1 ms 384 KB
subtask1_random01.txt WA 21 ms 5376 KB
subtask1_random02.txt WA 21 ms 5760 KB
subtask1_random03.txt WA 59 ms 6016 KB
subtask1_random04.txt WA 22 ms 3712 KB
subtask1_random05.txt AC 39 ms 5888 KB
subtask1_special01.txt AC 22 ms 5120 KB
subtask1_special02.txt AC 17 ms 2816 KB
subtask1_special03.txt AC 17 ms 2816 KB
subtask1_special04.txt AC 17 ms 2816 KB
subtask1_special05.txt AC 17 ms 2816 KB
subtask1_special06.txt AC 25 ms 3072 KB
subtask1_special07.txt AC 25 ms 3072 KB
subtask1_special08.txt AC 25 ms 3072 KB
subtask1_special09.txt AC 25 ms 3072 KB
subtask1_special10.txt AC 25 ms 3072 KB
subtask1_special11.txt AC 25 ms 5120 KB
subtask1_special12.txt AC 25 ms 3072 KB
subtask1_special13.txt AC 24 ms 3072 KB
subtask1_special14.txt AC 1 ms 1024 KB
subtask1_special15.txt AC 88 ms 5632 KB