【题目】
题目描述:
BSOI在线评测机被不明身份的人入侵了!!系统中大量的数据遭到恶意破坏,数据文件残缺不全。现在,老师正在尽力抢救数据文件。为了检查数据文件是否完整,老师打印出了所有文件的列表,但数据文件太多,老师眼睛都要看花了。所以,为了方便老师检查,需要你写个程序处理一下文件列表,转换成下面这样统一的格式:( //后面为注释 )
data //data文件夹,根目录
|----prob //data下面的文件夹
| |----a.in //prob下面的文件
| |----a.out
|----qq //data下面的文件夹
| |----new //qq下面的文件夹
| | |----ok.txt //new下面的文件
| |----old //空文件夹
|----xxx.rmvb
生成的列表格式有如下要求:
1.属于同一层的文件或文件夹位于相同的缩进处,相邻两层文件间差距 5 个字符;
2.每个文件夹或文件前有 4 个 '-' (根目录除外),文件夹下方属于文件夹的部分有 '|';
3.属于同一文件夹下的文件或子文件夹按字典序排列;
输入格式:
第一行一个整数 n(n ≤ 50),表示总共的文件数目;
接下来 n 行,每行描述一个文件的路径,路径以 '/' 作为文件分隔符;
所有文件(及文件夹)名均由小写字母和英文点组成;
所有输入的根目录都是一样的,文件名长度不超过 10 个字符,每个文件夹下不超过 15 个文件,不超过 5 层。
输出格式:
输出符合要求的文件列表。
样例数据:
输入
5 mydoc/abcd/abc.txt mydoc/dd/libexec.a mydoc/stdio.h mydoc/abcd/zzz/game.cpp mydoc/abcd/new
输出
mydoc |----abcd | |----abc.txt | |----new | |----zzz | | |----game.cpp |----dd | |----libexec.a |----stdio.h
备注:
【数据范围】
对于 30% 的数据,根目录下只有文件,没有文件夹。
【分析】
起初做这道题只是感觉比较好玩,结果卡了我半天
思路还是很简单的,就是先对文件路径进行排序,对于每个文件路径,都跟上一个文件路径进行比较,如果发现了不一样的文件,就输出它以及它以后的所有文件
推荐使用 string 类型,这样方便排序
【代码】
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num[100];
string a[100],s[100][10];
string Get_string(int id,int &now)
{
string ans="";
while(a[id][now]!='/')
{
ans+=a[id][now];
now++;
}
return ans;
}
int main()
{
int n,i,j,k,l,x;
cin>>n;
for(i=1;i<=n;++i)
cin>>a[i];
sort(a+1,a+n+1);
for(i=1;i<=n;++i)
{
a[i]+='/';
j=-1,num[i]=0;
l=a[i].length();
while(j+1<l)
s[i][++num[i]]=Get_string(i,++j);
}
for(i=1;i<=n;++i)
{
for(j=1;j<=num[i];++j)
if(s[i][j]!=s[i-1][j])
break;
x=j;
for(j=x;j<=num[i];++j)
{
for(k=1;k<=j-2;++k)
cout<<"| ";
if(j!=1) cout<<"|----";
cout<<s[i][j]<<'\n';
}
}
return 0;
}