Hidden Hierarchy

题目链接

题目描述

You are working on the user interface for a simple text-based file explorer. One of your tasks is to build a navigation pane displaying the directory hierarchy. As usual, the filesystem consists of directories which may contain files and other directories, which may, in turn, again contain files and other directories etc. Hence, the directories form a hierarchical tree structure. The top-most directory in the hierarchy is called the root directory. If directory d directly contains directory e we will say that d is the parent directory of e while e is a subdirectory od d. Each file has a size expressed in bytes. The directory size is simply the total size of all files directly or indirectly contained inside that directory.

All files and all directories except the root directory have a name — a string that always starts with a letter and consists of only lowercase letters and “.” (dot) characters. All items (files and directories) directly inside the same parent directory must have unique names. Each item (file and directory) can be uniquely described by its path — a string built according to the following rules:

  • Path of the root directory is simply “/” (forward slash).
  • For a directory d, its path is obtained by concatenating the directory names top to bottom along the hierarchy from the root directory to d, preceding each name with the “/” character and placing another “/” character at the end of the path.
  • For a file f , its path is the concatenation of the parent directory path and the name of file f .

    We display the directory hierarchy by printing the root directory. We print a directory d by outputting a line of the form “md pd sd” where pd and sd are the path and size of directory d respectively, while md is its expansion marker explained shortly. If d contains other directories we must choose either to collapse it or to expand it. If we choose to expand d we print (using the same rules) all of its subdirectories in lexicographical order by name. If we choose to collapse directory d, we simply ignore its contents.

    The expansion marker md is a single blank character when d does not have any subdirectories, “+” (plus) character when we choose to collapse d or a “-” (minus) character when we choose expand d.

    Given a list of files in the filesystem and a threshold integer t, display the directory hierarchy ensuring that each directory of size at least t is printed. Additionally, the total number of directories printed should be minimal. Assume there are no empty directories in the filesystem — the entire hierarchy can be deduced from the provided file paths. Note that the root directory has to be printed regardless of its size. Also note that a directory of size at least t only has to be printed, but not necessarily expanded.

输入

The first line contains an integer n (1 ≤ n ≤ 1 000) — the number of files. Each of the following n lines contains a string f and an integer s (1 ≤ s ≤ 1e6) — the path and the size of a single file. Each path is at most 100 characters long and is a valid file path according to the rules above. All paths will be different.

The following line contains an integer t (1 ≤ t ≤ 1e9) — the threshold directory size.

输出

Output the minimal display of the filesystem hierarchy for the given threshold as described above.

样例

input
9
/sys/kernel/notes 100
/cerc/problems/a/testdata/in 1000000
/cerc/problems/a/testdata/out 8
/cerc/problems/a/luka.cc 500
/cerc/problems/a/zuza.cc 5000
/cerc/problems/b/testdata/in 15
/cerc/problems/b/testdata/out 4
/cerc/problems/b/kale.cc 100
/cerc/documents/rules.pdf 4000
10000
output
- / 1009727
- /cerc/ 1009627
/cerc/documents/ 4000
- /cerc/problems/ 1005627
- /cerc/problems/a/ 1005508
/cerc/problems/a/testdata/ 1000008
+ /cerc/problems/b/ 119
+ /sys/ 100
input
8
/b/test/in.a 100
/b/test/in.b 1
/c/test/in.a 100
/c/test/in.b 1
/c/test/pic/in.a.svg 10
/c/test/pic/in.b.svg 10
/a/test/in.a 99
/a/test/in.b 1
101
output
- / 322
+ /a/ 100
- /b/ 101
/b/test/ 101
- /c/ 121
+ /c/test/ 121
input
2
/a/a/a 100
/b.txt 99
200
output
+ / 199

题意

这个题目超级长,废话也超级多。大概就是做一个目录。

有n条路径,每条路径下有一个大小为val的文件。

根文件为“/”;

给一个t;

如果目录下文件大小有一个大于等于t,展开“-”;

如果都小于t,折叠“+”;

如果没有文件,则输出一个“ ”。

注意:输出路径按字典序排序。

思路

首先把每个文件路径及其大小读入,按字典序排序。

然后把路径分开,建树。

根据题目要求输出就可以了。

有几个点注意:

内存问题,刚开始用数组存储,结果导致RE跟MLE二选一,后来改成了vector。

输出问题,这里需要采用递归输出。

剩下的就是疯狂模拟就可以了。

附上AC代码。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector> using namespace std; struct WJ//记录文件,及其目录下有多少文件;
{
int len,w,parent;
char name[105];
vector<int>next;
};
struct Char//记录输入的字符串;
{
char s[105];
int w;
}; vector<WJ>p;
char name[105][105];
int num,w,num2;//num,文件个数;num2,每个路径的文件个数。 bool cmp(Char a,Char b)
{
if(strcmp(a.s,b.s)>0)
return false;
else if(strcmp(a.s,b.s)==0)
return a.w<b.w;
return true;
} void build(int x,int w,int j)
{
p[x].w += w;
if(j>=num2-1)//递归到路径文件就可以退出了;
return;
int i,a;
for(i=0;i<p[x].len;i++)
{
a = p[x].next[i];
if(strcmp(p[a].name,name[j])==0)
{
build(a,w,j+1);
return;
}
}
WJ q;
q.len = q.w = 0;
q.parent = x;
strcpy(q.name,name[j]);
p[x].next.push_back(num++);
p[x].len++;
p.push_back(q);
build(num-1,w,j+1);
} void print(int x)//递归输出文件路径
{
if(p[x].parent!=-1)
print(p[x].parent);
if(p[x].parent==-1)
return;
printf("%s/",p[x].name);
} void show(int x)
{
int i,a;
if(p[x].len==0)
{
printf(" /");
print(x);
printf(" %d\n",p[x].w);
return;
}
for(i=0;i<p[x].len;i++)
{
a = p[x].next[i];
if(p[a].w>=w)
break;
}
if(i==p[x].len)
{
printf("+ /");
print(x);
printf(" %d\n",p[x].w);
}
else
{
printf("- /");
print(x);
printf(" %d\n",p[x].w);
for(i=0;i<p[x].len;i++)
show(p[x].next[i]);
}
} int main()
{
int n,i,j,k,len;
Char s[1050];
WJ q;
q.len = q.w = 0;
q.parent = -1;
p.push_back(q);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s%d",s[i].s,&s[i].w);
scanf("%d",&w);
sort(s,s+n,cmp);
num = 1;
for(k=0;k<n;k++)//把每个路径分割;
{
num2 = 0; len = strlen(s[k].s);
for(i=0;i<len;i++)
{
if(s[k].s[i]=='/')
{
for(j=i+1;s[k].s[j]!='/'&&j<len;j++)
name[num2][j-i-1] = s[k].s[j];
name[num2][j-i-1] = '\0';
num2++;
}
i = j - 1;
}
build(0,s[k].w,0);
}
show(0);
return 0;
}

Gym - 101620H_Hidden Hierarchy(树+模拟)的更多相关文章

  1. CERC2017 H Hidden Hierarchy(树+模拟)

    题意: 在一些给定的目录里按要求展开到制定大小并按字典序输出 思路: 因为有目录这个东西,所以想到模拟一个类似字典树的东西,不过这里每个儿子可能有n个节点,而且不能O(1)查询了 代码超长.. #in ...

  2. hdu_5818_Joint Stacks(线段树模拟)

    题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...

  3. 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流

    昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...

  4. hdu3436 splaytree树模拟队列+离散化缩点

    数据较大,需要先把每个top不会操作到的段缩成一个点,记录其开始和结束的位置,和top能操作到的点一起建立一颗伸展树模拟 然后就是普通的队列模拟操作 /* 不会被top操作到的区间就缩点 通过spla ...

  5. poj2828 伸展树模拟

    用伸展树模拟插队比线段树快乐3倍.. 但是pojT了.别的oj可以过,直接贴代码. 每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可 #include<iostrea ...

  6. C/C++深度优先搜索(递归树模拟)

    //C++深度优先搜索(递归树模拟) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #define MAX_N 1000 usin ...

  7. 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)

    题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树.  开始和队友 ...

  8. POJ-2886 Who Gets the Most Candies?(线段树+模拟)

    题目大意:n个小孩按顺时针站成一圈,每次会有一个小孩出队(第一个出队的小孩已知),在他出队时会指定下一个出队的小孩,直到所有的小孩全部出队游戏结束.第p个出队的小孩会得到f(p)个糖果,f(p)为p的 ...

  9. 【BZOJ4523】[Cqoi2016]路由表 Trie树模拟

    [BZOJ4523][Cqoi2016]路由表 Description 路由表查找是路由器在转发IP报文时的重要环节.通常路由表中的表项由目的地址.掩码.下一跳(Next Hop)地址和其他辅助信息组 ...

随机推荐

  1. centos安装消息队列beanstalkd

    起因:开始想在windows安装beanstalkd,可以找了很多资料都没有成功.最终还是妥协.在虚拟机上装一个centos系统,然后在centos上安装beanstalkd供windows使用 yu ...

  2. myql 配置项

    提高数据插入速度方法 bulk_insert_buffer_size 默认:8M (8*1024*1024) 参考网址:https://stackoverflow.com/questions/2030 ...

  3. 接口--全局异常配置--异常处理handle自定义配置

    在重写了异常处理的handle类之后需要配置配置文件中handle的路径:

  4. HDU2056

    /*  * 指数型母函数  */ #include<cstdio> #define mod 100 typedef long long LL;//杭电需用int64 int powerMo ...

  5. JS---案例:高清放大镜

    案例:高清放大镜 分3步 1. 鼠标进入和离开,显示和隐藏遮挡层和大图div 2. 鼠标在小层上移动,鼠标横纵坐标,为可视区域坐标-遮挡层的宽高,鼠标移动的时候,在一个区域内移动,需要判断和定义下移动 ...

  6. htmlunit学习之java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargoylesoftware/htmlunit/WebClientOptions;

    运行到这里就报错 java.lang.NoSuchMethodError: com.gargoylesoftware.htmlunit.WebClient.getOptions()Lcom/gargo ...

  7. CSS中ul li居中的问题

    一直以为对ul li居中对齐已经掌握了.但最近做项目时发现之前li的float:left方法显然有一个问题,就是无法居中(水平),只能使用padding-left或margin-right的方法方法来 ...

  8. jQuery的deferred对象使用详解【转载】

    一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...

  9. Spring MVC使用ModelAndView进行重定向(转)

    1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...

  10. HTML5小知识汇总

    1.关于<!DOCTYPE HTML> H5只需要<!DOCTYPE HTML>这样简单的声明,不用之前一长串代码,因为H5不是基于SGML,所以不需要对DTD引用,但是需要D ...