在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。
输入格式:
输入首先给出正整数N(≤104),表示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 <bits/stdc++.h>
using namespace std;
const int maxn=1e4;
char a[333];
struct p
{
char str[333];
int siz;
int od;
p*next[333];
};
int top;
bool cmp(p *a , p *b)
{
if(a->od!=b->od)return a->od>b->od;
else return strcmp(a->str,b->str)<0;
}
void pre(p*root)
{
int i, j;
for(i=0; i<top; i++)printf(" ");
printf("%s\n", root->str);
top++;
char t[333];
for(i=0; i<root->siz; i++)
{
sort(root->next, root->next+root->siz, cmp);
pre(root->next[i]);
}
top--;
return;
}
int main()
{
int n;
cin>>n;
int i, j;
p*root=(p*)malloc(sizeof(p));
for(i=0; i<332; i++)root->next[i]=NULL;
root->siz=0;
strcpy(root->str, "root");
int s=0, k;
char e[333];
p*q;
top=0;
for(i=0; i<n; i++)
{
q=root;
scanf("%s", a);
int siz;
for(j=0; a[j]; j++)
{
// if(i==6)printf("%c", a[j]);
if(a[j]=='\\')
{
e[s]='\0';
siz=q->siz;
for(k=0; k<q->siz; k++)
{
if(strcmp(e, q->next[k]->str)==0)
{
q=q->next[k];
break;
}
}
// printf("%d %d\n", k, siz);
// if(i==6)printf("%s %d %d\n", e, k, q);
if(k>=siz)
{
q->next[q->siz]=(p*)malloc(sizeof(p));
q->next[q->siz]->siz=0;
strcpy(q->next[q->siz]->str, e);
q->siz++;
q=q->next[siz];
q->od=1;
// printf("%s",e);
s=0;
// printf("%s\n", e);
}
s=0;
}
else e[s++]=a[j];
}
if(!a[j] && a[j-1]!='\\')
{
e[s]='\0';
siz=q->siz;
q->next[q->siz]=(p*)malloc(sizeof(p));
q->next[q->siz]->siz=0;
strcpy(q->next[q->siz]->str, e);
q->siz++;
q=q->next[siz];
q->od=0;
s=0;
// printf("%s\n", e);
}
}
// cout<<123<<endl;
// printf("root\n");
pre(root);
return 0;
}