文件列表

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值