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.属于统一文件夹下的文件或子文件夹按字典序排列;
样例输入:
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
不知道为什么T的同学可以试试以下样例
6
mydoc/abcd/abc.txt
mydoc/dd/libexec.a
mydoc/stdio.h
mydoc/abcd/luhan/zzz/game.cpp
mydoc/abcd/new
mydoc/zzz/luhan
mydoc
|----abcd
| |----abc.txt
| |----luhan
| | |----zzz
| | | |----game.cpp
| |----new
|----dd
| |----libexec.a
|----stdio.h
|----zzz
| |----luhan
6
mydoc/abcd/abc.txt
mydoc/dd/libexec.a
mydoc/stdio.h
mydoc/abcd/luhan/zzz/luhan/game.cpp
mydoc/abcd/new
mydoc/zzz/luhan
mydoc
|----abcd
| |----abc.txt
| |----luhan
| | |----zzz
| | | |----luhan
| | | | |----game.cpp
| |----new
|----dd
| |----libexec.a
|----stdio.h
|----zzz
| |----luhan
是不是感觉恍然大悟
题解:
建图 + dfs输出(是在原来T的代码上搞出来的)
- 在同一级的字符串后加一点乱七八糟的东西
- 在同一级下爸爸不同,但自己相同的 字符串后面+的东西*2,让他们变得不同
#include <bits/stdc++.h>
using namespace std;
set<string> a[100010],b[100010];
set<string>::iterator it;
map<string,int> h;
string name[10010];
void dfs(int u,int k)
{
int i;
set<string>::iterator it;
for(i=1; i<=k; i++)
if(i<k) cout<<"| ";
else cout<<"|----";
cout<<name[u].substr(0,name[u].find('/'))<<endl;
for(it=a[u].begin(); it!=a[u].end(); it++) dfs(h[*it],k+1);
}
int main()
{
int n,cnt=0,i,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
string s,s1="",s2;
cin>>s;
char ch='0';
while(s!="")
{
ch++;// 乱七八糟的东西
if(s.find('/')!=-1)
{
s2=s.substr(0,s.find('/'));
s=s.substr(s.find('/')+1,10000);
}
else s2=s,s="";
s2=s2+'/'+ch; // 开始加了
if(h[s2]!=0)
{
if(b[h[s2]].empty()) b[h[s2]].insert(s1);
else
{
it=b[h[s2]].begin();
if(s1!=*it) s2=s2+'/'+ch; // 同一个儿子他爸爸不同,就强行改变这个儿子
}
}
if(h[s2]==0)
{
h[s2]=++cnt;
name[cnt]=s2;
b[h[s2]].insert(s1); // 记录它的爸爸
}
a[h[s1]].insert(s2); // 记录爸爸的儿子
s1=s2;
}
}
dfs(1,0);
return 0;
}