#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;
}