7-30 目录树 (30 分)

7-30 目录树 (30 分)

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

输入格式:

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

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

输出格式:

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

输入样例:

1
2
3
4
5
6
7
8
7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\

输出样例:

1
2
3
4
5
6
7
8
9
10
11
root
a
d
z
a
bc
ab
cd
d
c
b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn=500;

struct node
{
string name;
int pri;
vector<node> vec;
node(){}
node(string name,int pri):name(name),pri(pri){}
}rt;

int cmp(node n1,node n2)
{
if(n1.pri==n2.pri) return n1.name<n2.name;
return n1.pri>n2.pri;
}

string a[maxn];
int pris[maxn];

void add(node &nd,int pos,int cnt)
{
if(cnt==pos) return;
int i;
for(i=0;i<nd.vec.size();i++)
{
if(a[pos]==nd.vec[i].name)
{
add(nd.vec[i],pos+1,cnt);
return ;
}
}

node tnd(a[pos],pris[pos]);
nd.vec.push_back(tnd);
add(nd.vec[i],pos+1,cnt);
}

void dfs(node nd,int cnt)
{
for(int i=0;i<cnt;i++) printf(" ");
printf("%s\n",nd.name.c_str());
sort(nd.vec.begin(),nd.vec.end(),cmp);
for(int i=0;i<nd.vec.size();i++) dfs(nd.vec[i],cnt+1);
}

int main()
{
int n, cur;
string s,ts;
stringstream ss;
while(~scanf("%d",&n))
{
cin.get();
rt.name="root";
rt.pri=1; // 是目录
rt.vec.clear();
for(int i=0;i<n;i++)
{
getline(cin,s);
int flag=s[s.length()-1]=='\\'?1:0; // 判断最后是否为目录
for(int j=0;j<s.length();j++)
if(!isalpha(s[j])) s[j]=' ';

ss.clear(); ss.str(""); ss<<s;
cur=0;
while(ss>>ts)
{
a[cur]=ts;
pris[cur++]=1; // 标记为目录
}

if(!flag) pris[cur-1]=0;
add(rt,0,cur);
}

dfs(rt,0);
}

return 0;
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×