当前位置: 首页 > news >正文

UVa 645 File Mapping

题目描述

在图形用户界面出现之前,计算机用户常通过缩进形式查看目录结构。本题要求模拟文件系统的目录映射,给定一系列目录名(以d开头)和文件名(以f开头),以及目录结束标记],输出缩进形式的目录树,要求每个目录下先显示子目录(按输入顺序),再显示文件(按字母序)。每个数据集以*结束,整个输入以#结束。

输入格式

输入包含多个数据集。每个数据集的开始是若干行,每行一个字符串,表示文件名(以f开头)或目录名(以d开头),或目录结束标记]。数据集以单独一行*结束。整个输入以单独一行#结束。

输出格式

对于每个数据集,输出:

DATA SET X: ROOT

然后按缩进方式输出目录结构,子目录先出现,后跟文件,文件按字母序排列。每个目录的缩进为|(竖线加五个空格)。不同数据集之间用一个空行分隔。

样例

输入

file1 file2 dir3 dir2 file1 file2 ] ] file4 dir1 ] file3 * file2 file1 * #

输出

DATA SET 1: ROOT | dir3 | | dir2 | | file1 | | file2 | dir1 file1 file2 file3 file4 DATA SET 2: ROOT file1 file2

题目分析

本题要求模拟文件系统的目录遍历,并按特定顺序输出。目录名和文件名由首字符区分(df),目录结束用]表示。数据结构上,需要维护一个当前路径栈,以及每个目录下的文件集合(自动按字母序排序)。子目录在遇到d时立即输出(缩进后),并压栈;遇到]时,输出当前目录的所有文件(缩进后),然后出栈;遇到f时,将文件名加入当前目录的文件集合。整个数据集结束后,根目录的文件也需要输出。

由于输入规模较小,直接模拟即可。

解题思路

  1. 维护一个栈indexer表示当前目录的路径,使用一个映射dirs存储目录编号到目录名的对应关系,另一个映射files存储每个目录下的文件集合(set<string>自动排序)。
  2. 对于每个数据集:
    • 输出标题DATA SET X:ROOT
    • 初始化根目录(编号 0,名称为"ROOT"),压栈。
    • 循环读取每一行:
      • 若为"*""#",退出循环。
      • 若以'f'开头,将文件名插入当前目录的文件集合。
      • 若以'd'开头,创建新目录(分配新编号),输出缩进后的目录名,压栈。
      • 若为"]",则输出当前目录的所有文件(缩进后),然后出栈。
    • 数据集结束时,输出根目录的所有文件。
  3. 缩进控制:输出时,除根目录外,每层缩进为"| ",缩进次数等于当前栈深度减111(因为根目录不缩进)。

复杂度分析

  • 每个文件或目录处理一次,时间复杂度O(Nlog⁡K)O(N \log K)O(NlogK),其中NNN为条目总数,KKK为每个目录下的文件数(排序开销)。
  • 空间复杂度O(N)O(N)O(N)

代码实现

// File Mapping// UVa ID: 645// Verdict: Accepted// Submission Date: 2018-03-28// UVa Run Time: 0.000s//// 版权所有(C)2018,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);intcases=0;string line;while(getline(cin,line)){if(line=="#")break;if(cases++>0)cout<<'\n';cout<<"DATA SET "<<cases<<":\n";cout<<"ROOT\n";intidx=0;vector<int>indexer;map<int,string>dirs;map<int,set<string>>files;dirs[idx]="ROOT";indexer.push_back(idx++);do{if(line=="*")break;if(line.front()=='f')files[indexer.back()].insert(line);elseif(line.front()=='d'){dirs[idx]=line;indexer.push_back(idx++);for(inti=1;i<indexer.size();i++)cout<<"| ";cout<<dirs[indexer.back()]<<'\n';}else{for(autof:files[indexer.back()]){for(inti=1;i<indexer.size();i++)cout<<"| ";cout<<f<<'\n';}indexer.pop_back();}}while((getline(cin,line)));for(autof:files[0])cout<<f<<'\n';}return0;}

总结

本题通过栈模拟目录嵌套,利用set自动排序文件,实现了目录结构的缩进输出。关键点在于正确处理目录的进入和退出(]),以及输出顺序(子目录先于文件,文件按字母序)。由于输入规模较小,模拟法简洁高效。注意输出格式中的缩进和空行控制。

http://www.jsqmd.com/news/1161016/

相关文章:

  • 抖音批量下载终极指南:3步搞定无水印视频素材库
  • Eigen 稀疏矩阵操作
  • LeetCode Hot100刷题日志D8
  • eBPF 与 OpenTelemetry 融合:构建分布式追踪的 eBPF 探针
  • Spatial-Agent:大模型驱动的地理分析工作流引擎
  • 如何快速掌握Photon-GAMS光影包:面向Minecraft玩家的完整实战指南
  • QModMaster:免费开源ModBus调试工具终极指南,5分钟快速上手工业通信
  • 167、动态分配策略中 Anchor Ratio 的重新聚类:用 K-Means 调整 YOLOv11 默认 Anchor
  • Douyin-Downloader:抖音内容自动化采集的完整技术解决方案
  • 江诗丹顿中国区官方售后服务网点|官方服务电话及地址权威公示(2026年7月最新) - 江诗丹顿中国服务中心
  • 亨得利官方名表服务中心|热线电话及门店地址权威信息公告(2026年7月更新) - 亨得利官方博客
  • 探索华为eulerfs:新一代NVDIMM文件系统的终极指南
  • Claude Fable 5 扩展:免费访问扩展
  • 积家中国官方售后服务网络全指南|官网认证地址及电话全新启用(2026年7月最新) - 积家中国服务中心
  • LangChain4J:Java原生LLM应用开发核心框架解析
  • myql innodb 锁机制
  • 3步解锁:让Direct3D 8经典游戏在现代系统重获新生的智能方案
  • 亨得利官方名表服务中心|最新服务电话及地址权威信息公告(2026年7月更新) - 亨得利钟表维修中心
  • HBM技术如何解决AI计算内存瓶颈:从原理到实践
  • Tailwind IntelliSense在Cursor中卡顿?1个tsconfig.json参数+2个Cursor插件禁用项+1次LSP重启,5分钟解决97%的智能提示延迟问题
  • C++ 类和对象入门:类的定义、封装、对象大小与 this 指针
  • 江诗丹顿官方直营售后维修网点|官方服务电话及地址权威公示(2026年7月最新) - 江诗丹顿中国服务中心
  • 如何彻底告别百度网盘限速?这款开源解析工具让你免费享受高速下载
  • 2026年7月合肥大疆售后本地化服务全景|交通指引气候养护到店全攻略 - 大品牌推荐
  • 深度技术解析:NxNandManager如何实现Nintendo Switch NAND存储的专业管理
  • 由 Palantir CEO 的观点所展开的行业观察
  • protocol buffers(protobuf)安装教程
  • Caspase-2 活性分析试剂盒(比色法),灵敏捕捉凋亡早中期信号
  • ADS131M02与PIC18F96J94高精度数据采集方案详解
  • 2026华南地区医械电磁兼容检测企业哪个靠谱?合规机构大盘点+选型攻略+避坑FAQ全解析 - 行业观察网