在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。

输入格式:

输入首先给出正整数N(≤),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):

  • 路径和名称中的字符仅包括英文字母(区分大小写);
  • 符号“\”仅作为路径分隔符出现;
  • 目录以符号“\”结束;
  • 不存在重复的输入项目;
  • 整个输入大小不超过2MB。

输出格式:

假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。

输入样例:

7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\
 

输出样例:

root
  a
    d
      z
      a
    bc
  ab
    cd
    d
  c
  b


建树,结点包含文件夹名字以及子文件夹数组和文件数组,按照要求输出。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
struct cata {
    char name[300];
    vector<cata> sub;
    vector<string> file;
    cata(){} 
    cata(char *name) {
        strcpy(this -> name,name);
    }
    cata *find1(char *subname) {
        for(int i = 0;i < sub.size();i ++) {
            if(!strcmp(sub[i].name,subname)) return &sub[i];
        }
        return NULL;
    }
    bool find2(char *filename) {
        for(int i = 0;i < file.size();i ++) {
            if(!strcmp(file[i].c_str(),filename)) return true;
        }
        return false;
    }
}root,*l,*temp;
int n,c;
char s[300],ch;
void print(const char *t,int h) {
    for(int i = 0;i < h;i ++) printf("  ");
    printf("%s\n",t);
}
bool cmp(cata &a,cata &b) {
    return strcmp(a.name,b.name) < 0;
}
void dfs(cata node,int h) {
    for(int i = 0;i < h;i ++) printf("  ");
    printf("%s\n",node.name);
    sort(node.sub.begin(),node.sub.end(),cmp);
    for(int i = 0;i < node.sub.size();i ++) {
        dfs(node.sub[i],h + 1);
    }
    sort(node.file.begin(),node.file.end());
    for(int i = 0;i < node.file.size();i ++) {
        print(node.file[i].c_str(),h + 1);
    }
}
int main() {
    scanf("%d",&n);
    strcpy(root.name,"root");
    getchar();
    for(int i = 0;i < n;i ++) {
        l = &root;
        while((ch = getchar()) != '\n') {
            if(ch == '\\') {
                s[c] = 0;
                c = 0;
                temp = l -> find1(s);
                if(!temp) l -> sub.push_back(cata(s)),temp = &*(l -> sub.rbegin());
                l = temp;
            }
            else s[c ++] = ch;
        }
        if(c) {
            s[c] = 0;
            c = 0;
            if(!l -> find2(s)) l -> file.push_back(s);
        }
    }
    dfs(root,0);
}