Submission #3195781


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 dp = Array.make (Array.length scc) (IntMap.singleton 0 []) in
  for i = Array.length scc - 1 downto 0 do
    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 (Array.get dp) @@
      List.sort_uniq compare @@
      List.concat @@
      List.rev_map (fun v -> List.rev_map (Array.get group) es.(v)) scc.(i)
  done;
  try
    begin
      List.iter print_char @@
      IntMap.find k @@
      Array.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 []) dp
    end;
    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 2812 Byte
Status WA
Exec Time 169 ms
Memory 6400 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 24 ms 4736 KB
subtask1_random02.txt WA 27 ms 5376 KB
subtask1_random03.txt WA 23 ms 4992 KB
subtask1_random04.txt WA 26 ms 5760 KB
subtask1_random05.txt AC 30 ms 4864 KB
subtask1_special01.txt AC 22 ms 5248 KB
subtask1_special02.txt AC 35 ms 5888 KB
subtask1_special03.txt AC 29 ms 5888 KB
subtask1_special04.txt AC 50 ms 6016 KB
subtask1_special05.txt AC 24 ms 4992 KB
subtask1_special06.txt AC 35 ms 3840 KB
subtask1_special07.txt AC 35 ms 4864 KB
subtask1_special08.txt AC 35 ms 5248 KB
subtask1_special09.txt AC 35 ms 3840 KB
subtask1_special10.txt AC 35 ms 5376 KB
subtask1_special11.txt AC 33 ms 4736 KB
subtask1_special12.txt AC 31 ms 4992 KB
subtask1_special13.txt AC 30 ms 5376 KB
subtask1_special14.txt AC 2 ms 1024 KB
subtask1_special15.txt AC 169 ms 6400 KB