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. LUOGU P2441 角色属性树

    题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长--. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例 ...

  2. Caused by: java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

    学习htmlutil发现报错 完整的引入 <!-- 引入htmlunit --> <dependency> <groupId>net.sourceforge.htm ...

  3. 大数据概念(4V)

  4. hdu 1296 Polynomial Problem(多项式模拟)

    Problem Description We have learned how to obtain the value of a polynomial when we were a middle sc ...

  5. BZOJ2529: [Poi2011]Sticks

    2529: [Poi2011]Sticks Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 257  Solved: ...

  6. golang在import自己的包报错问题

    原因:使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错 解决:把项目名称改写成import导入包的名称,即cmdbAp ...

  7. jmeter 通过csv data set config 设置参数化后,执行结果显示为<EOF>

    通过csv data set config 设置参数化后,执行结果显示为<EOF>: 反复确认相应的参数的设置均没有问题,其中csv文件编码方式采用uft-8.在csv data set ...

  8. maven本地仓库有jar包,maven install还是报错识别不到

    去本地仓库对应jar的目录下看下,有一个 _remote.repositories 的文件打开 ***.pom>xxx=***.jar>xxx= 这个 xxx 就是你maven的setti ...

  9. Legal or Not HDU - 3342 (拓扑排序)

     注意点: 输入数据中可能有重复,需要进行处理! #include <stdio.h> #include <iostream> #include <cstring> ...

  10. PHP 中Session 反序列化机制的三种方法

    �php.ini中存在三项配置项: session.save_path="" --设置session的存储路径 session.save_handler=""- ...