1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 幅優先・深さ優先探索メニュー応用編(言語選択)
  4. 問題一覧 PHP編
  5. ディスク使用量

幅優先・深さ優先探索メニュー応用編のサムネイル
ディスク使用量 (paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

ディスクに含まれるディレクトリ (フォルダ) と各ファイルの木構造、ファイルのサイズが与えられます。
各ディレクトリについて、そのディレクトリに含まれるファイルのサイズの合計を計算してください。
ただし、ディレクトリ直下のファイルだけでなく、子ディレクトリのファイルなども含め再帰的にすべてのファイルのサイズを合計してください。
また、各ファイルのサイズも、ディレクトリのサイズと同様に出力してください。

入力される値

n
DATA_1
DATA_2
...
DATA_n

・ 1 行目に、ディレクトリとファイルの総数 n が与えられます。
・ 続く n 行では、ディレクトリまたはファイルのデータ DATA が改行区切りで与えられます。

ディレクトリまたはファイルのデータ DATA は、以下のいずれかの形式で与えられます。

・ ディレクトリの場合
directory_name 0 num child_1 child_2 ... child_num

・ ディレクトリの名前を表す文字列 directory_name と 0, そのディレクトリに含まれるディレクトリとファイルの総数 num (≧ 1) が半角スペース区切りで与えられ、その後、それぞれのデータが何番目に与えられるデータかを表す整数 child_1, child_2, ..., child_num が半角スペース区切りで与えられます。

・ ファイルの場合
file_name size 0

・ ファイルの名前を表す文字列 file_name と、そのサイズ size (≧ 1) および 0 が半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

合計 n 行出力してください。

i 行目には、i 番目のデータ (ディレクトリまたはファイル) の名前 (directory_name/file_name) と、それに含まれる全データの合計データサイズをこの順に半角スペース区切りで出力してください。

また、末尾に改行を入れ、余計な文字を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ 入力はすべて整数
・ 1 ≦ n ≦ 100,000 = 10^5
・ directory_name, file_name は、半角英小文字または半角ピリオド . で構成される長さ 256 以下の文字列
・ DATA_i がファイルの場合、1 ≦ size ≦ 1,000,000,000 = 10^9
・ DATA_i がディレクトリの場合、1 ≦ num ≦ n - i
・ DATA_i がディレクトリの場合、i < child_1 < child_2 < ... < child_num ≦ n
・ 与えられる構造は根付き木をなす
・ 1 つ目のデータはルートディレクトリ (根付き木としてみたときの根) である
・ 空のディレクトリは存在しない
・ 入力の文字数は半角 5,000,000 文字以下

入力例1

5
usr 0 1 2
local 0 1 3
bin 0 2 4 5
gcc 100 0
clang 200 0

出力例1

usr 300
local 300
bin 300
gcc 100
clang 200

問題一覧へ戻る

ページの先頭へ戻る