#include <iostream>
#include <cstring>
#include <algorithm>
#define MAXCHAR 4 //单个文件名长度
#define MAXPATHLEN 512 //文件路径总长度
#define MAXFILECOUNT 32 //同级文件夹上限
using namespace std;
typedef struct BiTNode {
char Name[MAXCHAR];
BiTNode* firstChild;
BiTNode* nextSibling;
} BiTree, BiTNode;
typedef struct SortTable { //写完才发现要排序QAQ
char fc; //憨批测试案例反正就一位
BiTNode* address;
bool operator< (SortTable st) const {
if (fc == st.fc) {
return true;
} else {
return fc < st.fc;
}
}
} SortTable;
BiTNode* genNode(char* name) {
BiTNode* node = new BiTNode;
node->firstChild = nullptr;
node->nextSibling = nullptr;
memcpy(node->Name, name, MAXCHAR);
return node;
}
BiTNode* hasSameFile(char* s, BiTNode* node, bool& hasSame) {
BiTNode* prev = node;
BiTNode* current = node->firstChild;
while (current) {
//printf("current:%s, target:%s\n",current->Name,s);
if (strcmp(s, current->Name) == 0) {
hasSame = true;
return current;
} else {
prev = current;
current = current->nextSibling;
}
}
hasSame = false;
return prev; //返回最后停止的结点
}
void pathToNode(char* path, BiTNode* root) {
char fileName[MAXCHAR];
int nameLen = 0;
BiTNode* current = root; //当前文件夹
if (path[strlen(path) - 1] == '\\') {
path[strlen(path) - 1] = path[strlen(path)]; //剥去末尾符号
}
for (int i = 0; i <= strlen(path); i++) {
if (path[i] != '\\' && i != strlen(path)) {
//如果不是\也不是最后一个字符
fileName[nameLen++] = path[i];
} else {
fileName[nameLen] = '\0', nameLen = 0;
if (current->firstChild == nullptr) { //空文件夹
current->firstChild = genNode(fileName);//新建文件夹
current = current->firstChild;//打开新建文件夹
} else { //文件夹不空
bool hasSame;
//检查是否有文件名相同的,有则返回文件夹指针,否则停留在末尾
BiTNode* t = hasSameFile(fileName, current, hasSame);
if (hasSame) {
current = t;
} else {
t->nextSibling = genNode(fileName);//新建文件夹
current = t->nextSibling;
}
}
}
}
}
void freeTree(BiTNode *root) {
if (root == NULL) return;
freeTree(root->firstChild);
freeTree(root->nextSibling);
free(root);
}
void printer(BiTNode* node, int level) {
//先把同级的文件夹都翻出来
BiTNode* t = node;
if (!t) { //到末尾了
return;
}
int i = 0;
while (t) {
t = t->nextSibling;
i++;
}
t = node;
SortTable* st = new SortTable[i]();
memset(st, 0, sizeof(st));
for (int j = i; j > 0; j--) {
st[j - 1].address = t;
st[j - 1].fc = t->Name[0];
t = t->nextSibling;
}
sort(st, st + i);
for (int j = 0; j < i; j++) {
for (int k = 0; k < level; k++) cout<<" ";
cout<<st[j].address->Name<<endl;
// printf("%s\n", );
printer(st[j].address->firstChild, level + 1);
}
}
int main() {
int len;
char rootc[] = "\\\0";
char path[MAXPATHLEN];
while(scanf("%d", &len)==1){
BiTree* T = genNode(rootc); //文件系统根节点
while (len--) {
scanf("%s", &path);
pathToNode(path, T);
}
printer(T->firstChild, 0);
printf("\n");
freeTree(T);
}
return 0;
}