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. bzoj月赛1805

    题目在最后,FG还不会做,等着$NicoDafaGood$和$Achen$给我讲 A 对于每一个质因子建一棵线段树,直接查询就好了 主要是看到所有数的大小都不是很大,然后质因子最多只有log个,复杂度 ...

  2. C#中int short Int16 Int32 Int64区别

    Java中没有Int32,Int64,,java中只有int,short,long Java中int就代表Int32 ,short就代表Int16,long就代表Int64 首先,几个基本的关键字: ...

  3. 关于Ajax提交后无法刷新iframe页面的问题

    原因及解决方法: 要把刷新代码写进ajax的代码块里面,而不是放在后面

  4. golang之Sprintf函数

  5. 使用mybatis的延迟加载

    在某些情况下我们需要使用延迟加载技术来提高我们程序查询的性能,通过减少与数据库的连接操作,做到按需加载,这样达到提高程序性能的目的. 首先需要在全局配置文件(SqlMapConfig.xml)中配置全 ...

  6. 大咖手把手教您,DLA一键建仓!

    DLA很早之前就支持了对关系型数据库的查询,但是一直以来用户会有一个担心: 直接分析RDS里面的数据会不会影响线上业务. 这个担心很合理,除非你要查询的RDS是专门用来做后台数据分析使用的,否则直接大 ...

  7. 【水滴石穿】rn_antd_dva_reactnavigation

    这个项目好像就是记录了一个数据的流向,大体思想好像是这个 项目地址:https://github.com/Yangzhuren/rn_antd_dva_reactnavigation 先看效果 第一个 ...

  8. php怎么自动加载

    在 PHP 代码的顶部你是不是经常看到这样的代码. require 'lionis.php'; require 'is.php'; require 'cool.php'; 如果只是引入几个 PHP 脚 ...

  9. layui的select联动 - CSDN博客

    要实现联动效果注意两点: 第一要可以监听到select的change事件: 第二异步加载的内容,需要重新渲染后才可以 正常使用. html结构: <form class="layui- ...

  10. QLabel添加Click信号

    使用自定义label来实现此功能 其他控件可参照此例. #include "customerqlabel.h" CustomerQlabel::CustomerQlabel(QWi ...