#include #include #include #include #include #define MAX 15 using namespace std;

int main() { ios::sync_with_stdio(false); //本句用于加快cin和cout的速度 //使其达到与scanf和printf一样的速度 // cin和cout之所以缓慢,是因为会先存入缓冲器中 //而本句跳过了这一步骤,故让时间变快

int repeatTimes = 0;
while (cin >> repeatTimes && repeatTimes != 0)
{ // repeatTimes中保存了一共输入了多少行

    vector<string> path[MAX];
    //本句定义了最多MAX个vector<string>型的string动态数组
    //这一句相当于定义了一个二维的字符串数组

    for (int i = 0; i < repeatTimes; i++)
    { //此循环能够将所有的数据全部接收
        string str, tmp;
        //其中str用于接收每一行的直接给出的信息
        // tmp用于暂存当前一个文件名

        cin >> str;
        //用str接收当前行的所有指令
        int j = 0;
        while (j < str.size())
        { //对当前行的字符串进行处理
            if (str[j] == '\\')
            { //这个判断即将\这个字符给跳过
                j++;
                continue;
            }
            while (str[j] != '\\' && j < str.size())
            { //当没有到下一个文件时,将当前的文件名给存入tmp
                tmp += str[j++];
            }
            path[i].push_back(tmp);
            // https://blog.csdn.net/weixin_44556968/article/details/109112512
            //此处是对vector对象的push_back,可以向后添加字符串元素

            tmp.clear(); //此处必须要将tmp清空,因为这个函数在定义在while之外
            //故应该清空,错误
        }
    }

    sort(path, path + repeatTimes);
    for (int i = 0; i < repeatTimes; i++)
    { //本循环每次输出一整行的目录

        int index = 0; //标识了本字符串数组的某字符串位置
        string space;  //该space字符串的生存周期在for循环体内
                       //故每次都是重新定义,初始值为空串

        while (i != 0 && index < path[i].size() &&
               index < path[i - 1].size() &&
               path[i][index] == path[i - 1][index])
        { //本逻辑用于判断,本行和之前一行的前几位的匹配情况
            //仅于前一行比较即可
            //若是从左向右看,有目录项相同则直接index+1
            //从而在输出时,跳过本目录项
            ++index;
            space += "  ";
        }
        for (; index < path[i].size(); index++, space += "  ")
            cout << space << path[i][index] << "\n";
        //输出时,每一行的空格,都是逐步叠加的
    }
    cout << endl;
}
return 0;

}