"""
プログラミングのお題スレ Part17
https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1584031367/
826 名前:デフォルトの名無しさん[] 投稿日:2020/06/07(日) 00:53:20.20 ID:Trgw7Kao
>>795
お題:ソートされたパスの一覧を構造化して出力してください
入力:
フグ亜目
フグ亜目\ハリセンボン科
フグ亜目\ハリセンボン科\ハリセンボン属
フグ亜目\ハリセンボン科\ハリセンボン属\ハリセンボン
フグ亜目\マンボウ科
フグ亜目\マンボウ科\クサビフグ属
フグ亜目\マンボウ科\クサビフグ属\クサビフグ
フグ亜目\マンボウ科\マンボウ属
フグ亜目\マンボウ科\マンボウ属\ウシマンボウ
フグ亜目\マンボウ科\マンボウ属\カクレマンボウ
フグ亜目\マンボウ科\マンボウ属\マンボウ
フグ亜目\マンボウ科\ヤリマンボウ属
フグ亜目\マンボウ科\ヤリマンボウ属\ヤリマンボウ
出力:
フグ亜目
ハリセンボン科
ハリセンボン属
ハリセンボン
マンボウ科
クサビフグ属
クサビフグ
マンボウ属
ウシマンボウ
カクレマンボウ
マンボウ
ヤリマンボウ属
ヤリマンボウ
"""
import sys
class Node:
def __init__(self):
self.name = None
self.childs = []
def insert(self, toks, i=0):
if i >= len(toks):
return False
tok = toks[i]
if self.name == tok:
for child in self.childs:
if child.insert(toks, i + 1):
return True
child = Node()
self.childs.append(child)
return child.insert(toks, i + 1)
elif self.name is None:
self.name = tok.strip()
self.insert(toks, i + 1)
return True
else:
return False
def dump(self, dep=0):
if self.name:
print(dep * ' ' + self.name)
dep += 1
for child in self.childs:
child.dump(dep)
def main():
node = Node()
for line in sys.stdin.readlines():
toks = line.split('\\')
node.insert(toks)
node.dump()
if __name__ == '__main__':
main()
IiIiCuODl+ODreOCsOODqeODn+ODs+OCsOOBruOBiumhjOOCueODrCBQYXJ0MTcKaHR0cHM6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTU4NDAzMTM2Ny8KCjgyNiDlkI3liY3vvJrjg4fjg5Xjgqnjg6vjg4jjga7lkI3nhKHjgZfjgZXjgpNbXSDmipXnqL/ml6XvvJoyMDIwLzA2LzA3KOaXpSkgMDA6NTM6MjAuMjAgSUQ6VHJndzdLYW8KPj43OTUK44GK6aGM77ya44K944O844OI44GV44KM44Gf44OR44K544Gu5LiA6Kan44KS5qeL6YCg5YyW44GX44Gm5Ye65Yqb44GX44Gm44GP44Gg44GV44GECuWFpeWKm++8mgrjg5XjgrDkupznm64K44OV44Kw5Lqc55uuXOODj+ODquOCu+ODs+ODnOODs+enkQrjg5XjgrDkupznm65c44OP44Oq44K744Oz44Oc44Oz56eRXOODj+ODquOCu+ODs+ODnOODs+Wxngrjg5XjgrDkupznm65c44OP44Oq44K744Oz44Oc44Oz56eRXOODj+ODquOCu+ODs+ODnOODs+Wxnlzjg4/jg6rjgrvjg7Pjg5zjg7MK44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkQrjg5XjgrDkupznm65c44Oe44Oz44Oc44Km56eRXOOCr+OCteODk+ODleOCsOWxngrjg5XjgrDkupznm65c44Oe44Oz44Oc44Km56eRXOOCr+OCteODk+ODleOCsOWxnlzjgq/jgrXjg5Pjg5XjgrAK44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjg57jg7Pjg5zjgqblsZ4K44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjg57jg7Pjg5zjgqblsZ5c44Km44K344Oe44Oz44Oc44KmCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5Fc44Oe44Oz44Oc44Km5bGeXOOCq+OCr+ODrOODnuODs+ODnOOCpgrjg5XjgrDkupznm65c44Oe44Oz44Oc44Km56eRXOODnuODs+ODnOOCpuWxnlzjg57jg7Pjg5zjgqYK44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjg6Tjg6rjg57jg7Pjg5zjgqblsZ4K44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjg6Tjg6rjg57jg7Pjg5zjgqblsZ5c44Ok44Oq44Oe44Oz44Oc44KmCgrlh7rlipvvvJoK44OV44Kw5Lqc55uuCuOAgOOAgOODj+ODquOCu+ODs+ODnOODs+enkQrjgIDjgIDjgIDjgIDjg4/jg6rjgrvjg7Pjg5zjg7PlsZ4K44CA44CA44CA44CA44CA44CA44OP44Oq44K744Oz44Oc44OzCuOAgOOAgOODnuODs+ODnOOCpuenkQrjgIDjgIDjgIDjgIDjgq/jgrXjg5Pjg5XjgrDlsZ4K44CA44CA44CA44CA44CA44CA44Kv44K144OT44OV44KwCuOAgOOAgOOAgOOAgOODnuODs+ODnOOCpuWxngrjgIDjgIDjgIDjgIDjgIDjgIDjgqbjgrfjg57jg7Pjg5zjgqYK44CA44CA44CA44CA44CA44CA44Kr44Kv44Os44Oe44Oz44Oc44KmCuOAgOOAgOOAgOOAgOOAgOOAgOODnuODs+ODnOOCpgrjgIDjgIDjgIDjgIDjg6Tjg6rjg57jg7Pjg5zjgqblsZ4K44CA44CA44CA44CA44CA44CA44Ok44Oq44Oe44Oz44Oc44KmCiIiIgppbXBvcnQgc3lzCgoKY2xhc3MgTm9kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLm5hbWUgPSBOb25lCiAgICAgICAgc2VsZi5jaGlsZHMgPSBbXQoKICAgIGRlZiBpbnNlcnQoc2VsZiwgdG9rcywgaT0wKToKICAgICAgICBpZiBpID49IGxlbih0b2tzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRvayA9IHRva3NbaV0KICAgICAgICBpZiBzZWxmLm5hbWUgPT0gdG9rOgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHM6CiAgICAgICAgICAgICAgICBpZiBjaGlsZC5pbnNlcnQodG9rcywgaSArIDEpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGNoaWxkID0gTm9kZSgpCiAgICAgICAgICAgIHNlbGYuY2hpbGRzLmFwcGVuZChjaGlsZCkKICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmluc2VydCh0b2tzLCBpICsgMSkKICAgICAgICBlbGlmIHNlbGYubmFtZSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm5hbWUgPSB0b2suc3RyaXAoKQogICAgICAgICAgICBzZWxmLmluc2VydCh0b2tzLCBpICsgMSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgZHVtcChzZWxmLCBkZXA9MCk6CiAgICAgICAgaWYgc2VsZi5uYW1lOgogICAgICAgICAgICBwcmludChkZXAgKiAnICAgICcgKyBzZWxmLm5hbWUpCiAgICAgICAgICAgIGRlcCArPSAxCgogICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkczoKICAgICAgICAgICAgY2hpbGQuZHVtcChkZXApCgoKZGVmIG1haW4oKToKICAgIG5vZGUgPSBOb2RlKCkKICAgIGZvciBsaW5lIGluIHN5cy5zdGRpbi5yZWFkbGluZXMoKToKICAgICAgICB0b2tzID0gbGluZS5zcGxpdCgnXFwnKQogICAgICAgIG5vZGUuaW5zZXJ0KHRva3MpCgogICAgbm9kZS5kdW1wKCkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==
44OV44Kw5Lqc55uuCuODleOCsOS6nOebrlzjg4/jg6rjgrvjg7Pjg5zjg7Pnp5EK44OV44Kw5Lqc55uuXOODj+ODquOCu+ODs+ODnOODs+enkVzjg4/jg6rjgrvjg7Pjg5zjg7PlsZ4K44OV44Kw5Lqc55uuXOODj+ODquOCu+ODs+ODnOODs+enkVzjg4/jg6rjgrvjg7Pjg5zjg7PlsZ5c44OP44Oq44K744Oz44Oc44OzCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5EK44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjgq/jgrXjg5Pjg5XjgrDlsZ4K44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjgq/jgrXjg5Pjg5XjgrDlsZ5c44Kv44K144OT44OV44KwCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5Fc44Oe44Oz44Oc44Km5bGeCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5Fc44Oe44Oz44Oc44Km5bGeXOOCpuOCt+ODnuODs+ODnOOCpgrjg5XjgrDkupznm65c44Oe44Oz44Oc44Km56eRXOODnuODs+ODnOOCpuWxnlzjgqvjgq/jg6zjg57jg7Pjg5zjgqYK44OV44Kw5Lqc55uuXOODnuODs+ODnOOCpuenkVzjg57jg7Pjg5zjgqblsZ5c44Oe44Oz44Oc44KmCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5Fc44Ok44Oq44Oe44Oz44Oc44Km5bGeCuODleOCsOS6nOebrlzjg57jg7Pjg5zjgqbnp5Fc44Ok44Oq44Oe44Oz44Oc44Km5bGeXOODpOODquODnuODs+ODnOOCpg==
フグ亜目
フグ亜目\ハリセンボン科
フグ亜目\ハリセンボン科\ハリセンボン属
フグ亜目\ハリセンボン科\ハリセンボン属\ハリセンボン
フグ亜目\マンボウ科
フグ亜目\マンボウ科\クサビフグ属
フグ亜目\マンボウ科\クサビフグ属\クサビフグ
フグ亜目\マンボウ科\マンボウ属
フグ亜目\マンボウ科\マンボウ属\ウシマンボウ
フグ亜目\マンボウ科\マンボウ属\カクレマンボウ
フグ亜目\マンボウ科\マンボウ属\マンボウ
フグ亜目\マンボウ科\ヤリマンボウ属
フグ亜目\マンボウ科\ヤリマンボウ属\ヤリマンボウ