Submission #3216790


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 rec select acc trace = function
  | [] -> acc
  | x :: xs -> select ((trace, x, xs) :: acc) (x :: trace) xs
let select xs = select [] [] xs

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
    let m =
      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) in
    let css = select @@ List.sort compare @@ List.rev_map (Array.get cs) scc.(i) in
    dp.(i) <-
      IntMap.fold (fun i s ->
        List.fold_right (fun (s', c, _) m ->
          IntMap.add (i + List.length s' + 1)
            ( try min (List.rev_append s' (c :: s)) (IntMap.find (i + List.length s' + 1) m)
              with Not_found -> List.rev_append s' (c :: s) ) m) css) m m
  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 3079 Byte
Status WA
Exec Time 164 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 512 KB
subtask1_random01.txt WA 11 ms 6016 KB
subtask1_random02.txt WA 13 ms 4352 KB
subtask1_random03.txt WA 10 ms 4608 KB
subtask1_random04.txt WA 11 ms 5760 KB
subtask1_random05.txt AC 17 ms 5632 KB
subtask1_special01.txt AC 2 ms 2304 KB
subtask1_special02.txt AC 37 ms 5376 KB
subtask1_special03.txt AC 30 ms 5120 KB
subtask1_special04.txt AC 51 ms 5376 KB
subtask1_special05.txt AC 26 ms 6400 KB
subtask1_special06.txt AC 36 ms 4736 KB
subtask1_special07.txt AC 37 ms 5632 KB
subtask1_special08.txt AC 36 ms 5248 KB
subtask1_special09.txt AC 37 ms 5760 KB
subtask1_special10.txt AC 36 ms 4736 KB
subtask1_special11.txt AC 34 ms 3584 KB
subtask1_special12.txt AC 32 ms 5248 KB
subtask1_special13.txt AC 31 ms 3328 KB
subtask1_special14.txt AC 2 ms 1024 KB
subtask1_special15.txt AC 164 ms 6016 KB