Problem:


  MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

JAG-channel

JAG-channel
-->

ネイサン・O・デイビスはJAG-channelという電子掲示板を運営している．
彼は現在，スレッドビューという新機能の追加に取り組んでいる．

他の多くの電子掲示板と同じように，JAG-channelはスレッドベースである．
ここで，スレッドとは，一連の投稿からなる一つの会話のまとまりを指す．
投稿には，以下の2種類が存在する．

新しいスレッドを作る最初の投稿

すでにあるスレッドの過去の投稿への返信

スレッドビューは，投稿間の返信・被返信関係による論理的な構造を表す，ツリー状のビューである．
それぞれの投稿はツリーのノードとなり，その投稿に対する返信を子ノードとして持つ．
ある投稿に対する直接・間接の返信が，全体として部分木となることに注意してほしい．

例を見てみよう．例えば，
"hoge"という最初の投稿に対して
"fuga"と"piyo"という2つの返信が付き，
"fuga"に対してさらに"foobar"と"jagjag"という返信が付き，
"jagjag"に対して"zigzag"という返信が付いたとする．
このスレッドのツリーは次のようになる．

hoge
├─fuga
│　├─foobar
│　└─jagjag
│　　　└─zigzag
└─piyo

ネイサン・O・デイビスはプログラマーを雇って機能を実装させていたが，このプログラマーが最後の段階で失踪してしまった．
このプログラマーは，スレッドのツリーを作り，それを簡易フォーマットで表示するところまで完成させている．
この簡易フォーマットでは，返信の深さが '.' (半角ドット) で表され，ある投稿に対する返信は，元の投稿より1つ多くの '.' が左につく．また，ある投稿に対する返信は必ず元の投稿よりも下に来る．返信元の投稿と返信の間には，返信元の投稿に対する他の返信 (および，それに対する直接・間接の返信) が現れることがあるが，それ以外の投稿が両者の間に現れることはない．
上のツリーの簡易フォーマット表示は次のようになる．

hoge
.fuga
..foobar
..jagjag
...zigzag
.piyo

あなたの仕事は，この簡易フォーマット表示を受け取り，見やすく整形することである．
すなわち，

各投稿のすぐ左の '.' (各投稿の左についた '.' のうち，もっとも右のもの) を '+' (半角プラス)，

同じ投稿に対する直接の返信について，それぞれのすぐ左にある '+' の間に位置する '.' を '|' (半角縦線)，

それ以外の '.' は ' ' (半角スペース)

に置き換えて欲しい．

上の簡易フォーマット表示に対する整形済みの表示は次のようになる．

hoge
+fuga
|+foobar
|+jagjag
| +zigzag
+piyo

Input

入力は複数のデータセットから構成される．各データセットの形式は次の通りである．

$n$
$s_1$
$s_2$
...
$s_n$

$n$ は簡易フォーマット表示の行数を表す整数であり，$1$ 以上 $1{,}000$ 以下と仮定してよい．
続く $n$ 行にはスレッドツリーの簡易フォーマット表示が記載されている．
$s_i$ は簡易フォーマット表示の $i$ 行目を表し，いくつかの '.' と，それに続く $1$ 文字以上 $50$ 文字以下のアルファベット小文字で構成された文字列からなる．
$s_1$ はスレッドの最初の投稿であり，'.' を含まない．
$s_2$, ..., $s_n$ はそのスレッドでの返信であり，必ず1つ以上の '.' を含む．

$n=0$ は入力の終わりを示す．これはデータセットには含めない．

Output

各データセットに対する整形済みの表示を各 $n$ 行で出力せよ．

Sample Input

6
hoge
.fuga
..foobar
..jagjag
...zigzag
.piyo
8
jagjag
.hogehoge
..fugafuga
...ponyoponyo
....evaeva
....pokemon
...nowawa
.buhihi
8
hello
.goodmorning
..howareyou
.goodafternoon
..letshavealunch
.goodevening
.goodnight
..gotobed
3
caution
.themessagelengthislessthanorequaltofifty
..sothelengthoftheentirelinecanexceedfiftycharacters
0

Output for Sample Input

hoge
+fuga
|+foobar
|+jagjag
| +zigzag
+piyo
jagjag
+hogehoge
|+fugafuga
| +ponyoponyo
| |+evaeva
| |+pokemon
| +nowawa
+buhihi
hello
+goodmorning
|+howareyou
+goodafternoon
|+letshavealunch
+goodevening
+goodnight
 +gotobed
caution
+themessagelengthislessthanorequaltofifty
 +sothelengthoftheentirelinecanexceedfiftycharacters



Sample input:
6
hoge
.fuga
..foobar
..jagjag
...zigzag
.piyo
8
jagjag
.hogehoge
..fugafuga
...ponyoponyo
....evaeva
....pokemon
...nowawa
.buhihi
8
hello
.goodmorning
..howareyou
.goodafternoon
..letshavealunch
.goodevening
.goodnight
..gotobed
3
caution
.themessagelengthislessthanorequaltofifty
..sothelengthoftheentirelinecanexceedfiftycharacters
0


Sample output:
hoge
+fuga
|+foobar
|+jagjag
| +zigzag
+piyo
jagjag
+hogehoge
|+fugafuga
| +ponyoponyo
| |+evaeva
| |+pokemon
| +nowawa
+buhihi
hello
+goodmorning
|+howareyou
+goodafternoon
|+letshavealunch
+goodevening
+goodnight
 +gotobed
caution
+themessagelengthislessthanorequaltofifty
 +sothelengthoftheentirelinecanexceedfiftycharacters

Submission status: Wrong Answer

Solution code:
def count_dot(lis):
    c=0
    for i in lis:
        if not(i=='.'):
            return c
        c+=1

def solve(N):
    a=[]
    dot =[]
    for i in range(N):
        a.append([char for char in input()])
        dot.append(count_dot(a[i]))

    for i in range(N):
        for j in range(len(a[i])):
            if a[i][j]=='.':
                a[i][j]=' '

    for i in range(1,N):
        #print(type(dot[i]))
        a[i][dot[i]-1]='+'
        k=1
        while True:
#            print(i-k,dot[i])
            if a[i-k][dot[i]-1] == ' ':
                a[i-k][dot[i]]='|'
                k += 1
            else:
                break

    for i in range(N):
        for char in a[i]:
            print(char,end='')
        print()

while True:
    N=int(input())
#    print(N)
    if N==0:
        break
    solve(N)

Submission status: Accepted

Solution code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

def main():
  while True:
    n = input()
    if not n: break

    memo = []
    ans = []
    for i in xrange(n):
      s = raw_input()
      d = 0
      for c in s:
        if c == ".":
          d += 1
      memo.append(d)
      ans.append([" "] * d + [s[d:]])

    t = []
    for i in xrange(n - 1, -1, -1):
      d = memo[i]
      t = filter(lambda x: x < d, t)
      for tt in t:
        ans[i][tt] = "|"
      if d > 0:
        ans[i][d - 1] = "+"
        t.append(d - 1)

    for i in xrange(n):
      print "".join(ans[i])

  return 0

## -------------------------------------------
## TEMPLATE

from sys import stdin
from sys import setrecursionlimit
from copy import deepcopy
from math import sqrt
from itertools import permutations
from itertools import combinations

def getline():
  return stdin.readline()

def getLineAs(tp):
  return map(tp, getline().split())

def array(n, init = 0):
  return [deepcopy(init) for i in range(n)]

if __name__ == "__main__":
  setrecursionlimit(1024 * 1024)
  main()

Submission status: Accepted

Solution code:
while 1:
    n = int(raw_input())
    if n == 0: break
    S = [list(raw_input()) for i in xrange(n)]

    for y in xrange(n):
        for x in range(len(S[y])):     
            if S[y][x] == ".": S[y][x] = " "
            else:
                if x > 0:
                    S[y][x-1] = "+"
                    t = y-1
                    while S[t][x-1] == " ":
                        S[t][x-1] = "|"
                        t -= 1
                break
    for s in S: print "".join(s)

Submission status: Accepted

Solution code:
while 1:
    n=int(input())
    if n==0:break
    a=[list(input())for _ in [0]*n]
    for i in range(n):
        for j in range(len(a[i])):
            if a[i][j]=='.':a[i][j]=' '
            else:
                if j>0:
                    a[i][j-1]='+'
                    x=i-1
                    while a[x][j-1]==' ':
                        a[x][j-1]='|'
                        x-=1
                break
    [print(*b,sep='')for b in a]

Submission status: Accepted

Solution code:
import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy,functools

sys.setrecursionlimit(10**7)
inf = 10**20
eps = 1.0 / 10**10
mod = 998244353

def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def I(): return int(sys.stdin.readline())
def F(): return float(sys.stdin.readline())
def S(): return input()
def pf(s): return print(s, flush=True)


def main():
    rr = []

    while True:
        n = I()
        if n == 0:
            break
        a = [S() for _ in range(n)] + ['']
        b = [0] * (n+1)
        for i in range(1,n):
            s = a[i]
            b[i] = len(s.split('.')) - 1
        r = [[c for c in t] for t in a[:n]]
        for i in range(n):
            t = b[i]
            if t == 0:
                continue
            r[i][t-1] = '+'
            ni = i
            for j in range(i+1,n):
                if b[j] < t:
                    break
                if b[j] == t:
                    ni = j
                    break
            for j in range(i+1,ni):
                r[j][t-1] = '|'
            for j in range(t-1):
                if r[i][j] == '.':
                    r[i][j] = ' '
        for c in r:
            rr.append(''.join(c))

    return '\n'.join(map(str, rr))


print(main())

Submission status: Accepted

Solution code:
def count_dot(lis):
    c=0
    for i in lis:
        if not(i=='.'):
            return c
        c+=1

def solve(N):
    a=[]
    dot =[]
    for i in range(N):
        a.append([char for char in input()])
        dot.append(count_dot(a[i]))

    for i in range(N):
        for j in range(len(a[i])):
            if a[i][j]=='.':
                a[i][j]=' '

    for i in range(1,N):
        #print(type(dot[i]))
        a[i][dot[i]-1]='+'
        k=1
        while True:
#            print(i-k,dot[i]-1)
            if a[i-k][dot[i]-1] == ' ':
                a[i-k][dot[i]-1]='|'
                k += 1
            else:
                break

    for i in range(N):
        for char in a[i]:
            print(char,end='')
        print()

while True:
    N=int(input())
#    print(N)
    if N==0:
        break
    solve(N)

Submission status: Accepted

Solution code:
from collections import defaultdict,deque
import sys,heapq,bisect,math,itertools,string,queue,copy,time
sys.setrecursionlimit(10**8)
INF = float('inf')
mod = 10**9+7
eps = 10**-7
def inp(): return int(input())
def inpl(): return list(map(int, input().split()))
def inpl_str(): return list(input().split())


while True:
    N = inp()
    if N == 0:
        break
    else:
        tt = [[' ']*1100 for _ in range(N)]
        LL = [0]*N
        SS = ['']*N
        bL = 1000

        for i in range(N):
            S = input()
            L = S.count('.')
            LL[i] = L
            SS[i] = S[L:]
            tt[i][L] = '+'
            if L < bL:
                for j in reversed(range(i)):
                    if LL[j] == L:
                        break
                    else:
                        tt[j][L] = '|'
            bL = L

        print(SS[0])
        for i in range(1,N):
            tmp = ''
            for j in range(1,1100):
                if tt[i][j]!='+':
                    tmp = tmp + tt[i][j]
                else:
                    tmp = tmp + '+' + SS[i]
                    break
            print(tmp)

Submission status: Runtime Error

Solution code:
while True:
    N = input()
    if N == 0:
        break
    lst = []
    for i in range(N):
        lst.append(list(raw_input()))
    for i in range(N):
        for j in range(len(lst[i]) - 1):
            if lst[i][j] == '.' and lst[i][j + 1] != '.':
                pos = j
                for k in range(i, 0, -1):
                    if lst[k][pos] == '.':
                        lst[k][pos] = '|'
    for i in range(N):
        for j in range(len(lst[i]) - 1):
            if lst[i][j] == '|' and lst[i][j + 1] != '|':
                lst[i][j] = '+'
    for i in range(N):
        print ''.join(lst[i]).replace('.', ' ')

Submission status: Runtime Error

Solution code:
#!/usr/bin/env python

import sys
import math
import itertools as it
from collections import deque

sys.setrecursionlimit(10000000)

while True:
    N = input()
    if N == 0:
        break
    lst = []
    for i in range(N):
        lst.append(list(raw_input()))
    for i in range(N):
        for j in range(len(lst[i]) - 1):
            if lst[i][j] == '.' and lst[i][j + 1] != '.':
                for k in range(i, 0, -1):
                    if lst[k][pos] == '.':
                        lst[k][pos] = '|'
                    else:
                        break
    for i in range(N):
        for j in range(len(lst[i]) - 1):
            if lst[i][j] == '|' and lst[i][j + 1] != '|':
                lst[i][j] = '+'
    for i in range(N):
        print ''.join(lst[i]).replace('.', ' ')

Submission status: Runtime Error

Solution code:
def count_dot(lis):
    c=0
    for i in lis:
        if not(i=='.'):
            return c
        c+=1

def solve(N):
    a=[]
    dot =[]
    for i in range(N):
        a.append([char for char in input()])
        dot.append(count_dot(a[i]))

    for i in range(N):
        for j in range(len(a[i])):
            if a[i][j]=='.':
                a[i][j]=' '

    for i in range(1,N):
        #print(type(dot[i]))
        a[i][dot[i-1]]='+'
        k=1
        while True:
            if not(a[i-k][dot[i]] == ' '):
                break
            a[i-k][dot[i]]='|'
            k += 1
    for i in range(N):
        for char in a[i]:
            print(char,end='')
        print()

while True:
    N=int(input())
    if N==0:
        break
    solve(N)