【openjudge】【字符串+模拟】1777:文件结构“图”
【题目传送门:】戳
【描述:】
在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构。比如:
ROOT
| dir1
| file1
| file2
| file3
| dir2
| dir3
| file1
file1
file2
这个图说明:ROOT目录包括三个子目录和两个文件。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。
【输入:】
你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以'*'结尾,而所有合理的输入数据以'#'结尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以']'表示一个目录的内容的结束。目录名字的第一个字母是'd',文件名字的第一个字母是'f'。文件名可能有扩展名也可能没有(比如fmyfile.dat和fmyfile)。文件和目录的名字中都不包括空格,长度都不超过30。一个目录下的子目录个数和文件个数之和不超过30。
【输出:】
在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"DATA SET x:",这里x是测试数据的编号(从1开始)。在两组测试数据之间要输出一个空行来隔开。
你需要注意的是,我们使用一个'|'和5个空格来表示出缩排的层次。
【算法分析:】
跟去年的d1t2时间复杂度有一些像,
使用递归模拟,(递归常熟大也可以用栈)
递归函数有一个参数hp表示进入了几个文件
遇到 dir 就 hp+1,遇到 ] 就 hp-1,遇到 * 就return
如果遇到文件的话把文件加入到一个堆p[hp]中,这就在输出的时候保证了文件的字母是按字母表的顺序排的
p[i]表示第i层文件夹的文件
离线做,先把读入的一群字符串存到string数组里,用num[i]表示第i个文件结构的开始位置
递归时设置一个指针t,表示读到第t行string
每次递归或是遇到文件的时候t就自增1
最后结束时把p[1]里的文件输出
【代码:】
//文件结构“图”
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; int t, num[];
string s[];
priority_queue<string, vector<string>, greater<string> > q[]; void work(int hp) {
if(s[t][] == '*' || hp == ) return;
if(s[t][] == 'd') {
for(int i = ; i <= hp; i++)
printf("| ");
cout << s[t] << endl;
t++; work(hp + );
}
if(s[t][] == 'f') {
q[hp].push(s[t]);
t++; work(hp);
}
if(s[t][] == ']') {
while(!q[hp].empty()) {
for(int i = ; i < hp; i++)
printf("| ");
cout << q[hp ].top() << endl;
q[hp].pop();
}
t++; work(hp - );
}
}
int main() {
int x = , cnt = ;
num[cnt] = ;
while(cin >> s[x]) {
if(s[x] == "*") num[++cnt] = x + ;
++x;
}
x--, cnt--;
for(int i = ; i <= cnt; i++) {
printf("DATA SET %d:\nROOT\n", i);
t = num[i];
work();
while(!q[].empty()) {
cout << q[].top() << endl;
q[].pop();
}
puts("");
}
}
【openjudge】【字符串+模拟】1777:文件结构“图”的更多相关文章
- 用字符串模拟两个大数相加——java实现
问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...
- HDU-3787(字符串模拟)
Problem Description 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开.现在请计算A+B的结果,并以正常形式输出. Input 输入包含 ...
- HDU-1002.大数相加(字符串模拟)
本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include <cstdio&g ...
- Codeforces Round #425 (Div. 2) B. Petya and Exam(字符串模拟 水)
题目链接:http://codeforces.com/contest/832/problem/B B. Petya and Exam time limit per test 2 seconds mem ...
- HDU-Digital Roots(思维+大数字符串模拟)
The digital root of a positive integer is found by summing the digits of the integer. If the resulti ...
- Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)
P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...
- CCF(JSON查询:40分):字符串+模拟
JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...
- OpenJudge 2775 文件结构“图”/ Poj 1057 FILE MAPPING
1.链接地址: http://bailian.openjudge.cn/practice/2775 http://poj.org/problem?id=1057 2.题目: 总时间限制: 1000ms ...
- codeforces 723B Text Document Analysis(字符串模拟,)
题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...
随机推荐
- ECharts3.0饼状图使用问题总结
前提:本人使用的是IE9浏览器 1.IE中无法显示,谷歌却显示正常的问题: 1)情况一 var myChart_cols<%=i%> = echarts.init(document.get ...
- 【原】通过Dubbo注解实现RPC调用
启动Dubbo服务有2个方式,1是通过xml配置,2是通过注解来实现,这点和Spring相似. 采用XML配置如下: <?xml version="1.0" encoding ...
- gRPC版本的 Google APIs
gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240 ...
- python 查询数据库返回的数据类型
self.conn=MySQLdb.connect(host='localhost',port=3306, user='keystone', passwd='OptValley@4312', db=s ...
- JSP学习笔记(1)-JSP简介
1.什么是JSP? JSP是Java server page的缩写,有sun公司倡导,许多公司参与,于1999年推出的一种web服务设计标准.JSP基于Java Servlet以及整个java体系的W ...
- xamarin.android 实现 Activity 底部弹出对话框菜单
Resources/drawable 下新增如下文件: push_bottom_in.xml <?xml version="1.0" encoding="utf-8 ...
- ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况
ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...
- CentOS7系列--1.2CentOS7基本设置
CentOS7基本设置 1. 查看相关信息 1.1. 查看系统信息 1.1.1. 查看系统位数 方法1: [root@centos7 ~]# uname -a Linux centos7.smartm ...
- linux vim 快捷键
vim命令模式输入a i o 这些命令进入插入模式 编辑模式命令模式输入双引号进入编辑模式 命令模式命令 命令 作用 :map Ctrl+V Ctrl+P I#<ESC> 自定义注释快捷键 ...
- 1finally与return、exit()
public class TestException { public static void main(String[] args) { String[] str = {"1", ...