問題描述
BSOI 在線評測機被不明身份的人入侵了X汀!系統(tǒng)中大量的數(shù)據(jù)遭到惡意破壞笼痹,數(shù)據(jù)文件殘缺不全∨湓現(xiàn)在,老師正在盡力搶救數(shù)據(jù)文件凳干。為了檢查數(shù)據(jù)文件是否完整晴裹,老師打印出了所有文件的列表,但數(shù)據(jù)文件太多救赐,老師眼睛都要看花了涧团。所以,為了方便老師檢查,需要你寫個程序處理一下文件列表泌绣,轉(zhuǎn)換成下面這樣統(tǒng)一的格式:(//后面為注釋)
data //data 文件夾,根目錄
|----prob //data 下面的文件夾
| |----a.in //prob 下面的文件
| |----a.out
|----qq //data 下面的文件夾
| |----new //qq 下面的文件夾
| | |----ok.txt //new 下面的文件
| |----old //空文件夾
|----xxx.rmvb
生成的列表格式有如下要求:
1.屬于同一層的文件或文件夾位于相同的縮進(jìn)處钮追,相鄰兩層文件間差距 5 個字符;
2.每個文件夾或文件前有 4 個'-'(根目錄除外)阿迈,文件夾下方屬于文件夾的部分有'|'元媚;
3.屬于統(tǒng)一文件夾下的文件或子文件夾按字典序排列;
輸入文件(slides.in)
第一行一個整數(shù) n(n<=50)仿滔,表示總共的文件數(shù)目惠毁;
接下來 n 行,每行描述一個文件的路徑崎页,路徑以'/'作為文件分隔符鞠绰; 所有文件(及文件夾)名均由小寫字母和英文點組成;
所有輸入的根目錄都是一樣的飒焦,文件名長度不超過 10 個字符蜈膨,每個文件夾下不超過 15
個文件,不超過 5 層牺荠。
輸出文件(slides.out)
輸出符合要求的文件列表
樣例輸入
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
#include<iostream>
#include<string>
#include<algorithm>
#include<fstream>
using namespace std;
int n,x,y,tot;
int picture[251][251];
string str,sty,rec[251];
void build(){
int i;
x=y;
for (i=1;i<=picture[x][0];i++)
if (rec[picture[x][i]]==sty){
y=picture[x][i];
return;
}
tot++;
rec[tot]=sty;
y=tot;
picture[x][0]++;
picture[x][picture[x][0]]=y;
}
bool cmp(int i,int j){
return rec[i]<rec[j];
}
void dfs(int x,int step){
int i;
for (i=1;i<=step-2;i++)
cout<<"| ";
if (step==1)
cout<<rec[x]<<endl;
else
cout<<"|----"<<rec[x]<<endl;
for (i=1;i<=picture[x][0];i++)
dfs(picture[x][i],step+1);
}
int main(){
int i;
freopen("file.in","r",stdin);
freopen("file.out","w",stdout);
cin>>n;
tot=1;
for (i=1;i<=n;i++){
cin>>str;
sty=str.substr(0,str.find("/"));
str.replace(0,str.find("/")+1,"");
y=1;
rec[1]=sty;
while (str.find("/")!=string::npos){
sty=str.substr(0,str.find("/"));
str.replace(0,str.find("/")+1,"");
build();
}
sty=str;
build();
}
for (i=1;i<=tot;i++)
sort(picture[i]+1,picture[i]+picture[i][0]+1,cmp);
dfs(1,1);
return 0;
}