Week9—A—咕咕东的目录管理器

2023-05-16

题目描述:

课堂PPT在这里插入图片描述


Input:

输入文件包含多组测试数据,第一行输入一个整数表示测试数据的组数 T (T <= 20);

每组测试数据的第一行输入一个整数表示该组测试数据的命令总数 Q (Q <= 1e5);

每组测试数据的 2 ~ Q+1 行为具体的操作 (MKDIR、RM 操作总数不超过 5000);

面对数据范围你要思考的是他们代表的 “命令” 执行的最大可接受复杂度,只有这样你才能知道你需要设计的是怎样复杂度的系统。

Output:

每组测试数据的输出结果间需要输出一行空行。注意大小写敏感。

时空限制:

Time limit 6000 ms
Memory limit 1048576 kB

sample input:

1
22
MKDIR dira
CD dirb
CD dira
MKDIR a
MKDIR b
MKDIR c
CD ..
MKDIR dirb
CD dirb
MKDIR x
CD ..
MKDIR dirc
CD dirc
MKDIR y
CD ..
SZ
LS
TREE
RM dira
TREE
UNDO
TREE

sample output:

OK
ERR
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
9
dira
dirb
dirc
root
dira
a
b
c
dirb
x
dirc
y
OK
root
dirb
x
dirc
y
OK
root
dira
a
b
c
dirb
x
dirc
y

个人思路:

  • 分析题目后得知,TREE操作如果暴力的话,在极端情况下会超时:

     当 T = 20,numTrees = 5000,TREEs = 1e5 - 5000 = 1e5(近似):
     
     如果用普遍前序遍历,遍历一遍需要5000的计算量,所以 t = 20 * 1e5 * 5000 = 1e10 >> 6000ms
     
     显然超时了
    
  • 于是,学到了一种新方法:记忆化(缓存)

     在字典中设计:
     vector<string> pre, bck;//存前序的前面和后面的几个。
     
     bool tag;//标记是否被访问更新过
     因为对于目录相同的相同问题,是没必要重复访问的。
    

代码块:

//
// Created by 19703 on 2020/4/20.
//
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

map<string, int>cmp;
void mapp(){
    cmp["MKDIR"] = 1; cmp["RM"] = 2; cmp["CD"] = 3; cmp["SZ"] = 4; cmp["LS"] = 5; cmp["TREE"] = 6; cmp["UNDO"] = 7;
}
const int maxn = 1e5+5;
int T, Q;
vector<pair<string, pair<int, int> > >v;

struct Dict{
    string name;//节点名称
    map<string, int> mp;//子节点建立名称->编号的映射
    int fa, sz;//父亲节点、子树
    vector<string> pre, bck;//存先序遍历的前几个、后几个
    bool tag;//是否被更新过
};
int now = 0;
Dict node[maxn];
int tot = 0;
void init(){
    tot = 0;
    now = 0;
    node[now].name = "root";
    node[now].fa = -1;
    node[now].sz = 1;
    node[now].tag = 0;
    node[now].pre.clear();
    node[now].bck.clear();
    node[now].mp.clear();
    v.clear();
}
void update(int id, int num){
    while(id != -1){
        node[id].tag = 0;
        node[id].sz += num;
        id = node[id].fa;
    }
}
void mkdir(string nm){
    if(node[now].mp.count(nm)){
        cout << "ERR" << endl;
        return;
    }
    node[now].mp[nm] = ++tot;
    node[tot].name = nm;
    node[tot].fa = now;
    node[tot].sz = 1;
    node[tot].tag = 0;
    node[tot].pre.clear();
    node[tot].bck.clear();
    node[tot].mp.clear();
    update(now, 1);
    v.push_back(make_pair("MKDIR", make_pair(now, tot)));
    cout << "OK" << endl;
}
void RM(string nm){
    if(!node[now].mp.count(nm)){
        cout << "ERR" << endl;
        return;
    }
    int u = node[now].mp[nm];
    update(now, (-1) * node[u].sz);
    node[now].mp.erase(nm);
    v.push_back(make_pair("RM", make_pair(now, u)));
    cout << "OK" << endl;
}
void CD(string nm){
    if(nm == ".." && node[now].fa == -1){
        cout << "ERR" << endl;
        return;
    }else if(nm == ".."){
        v.push_back(make_pair("CD", make_pair(now, node[now].fa)));
        now = node[now].fa;
        cout << "OK" << endl;
        return;
    }
    if(!node[now].mp.count(nm)){
        cout << "ERR" << endl;
        return;
    }
    else {
        int u = node[now].mp[nm];
        v.push_back(make_pair("CD", make_pair(now, u)));
        now = u;
        cout << "OK" << endl;
    }
}
void SZ(){
    cout << node[now].sz << endl;
}
void ls(){
    int t = node[now].mp.size();
    if(t == 0){
        cout << "EMPTY" << endl;
        return;
    }
    auto pos = node[now].mp.begin();

    if(t >= 1 && t <= 10){
        while( pos != node[now].mp.end()){
            cout << pos->first << endl;
            pos++;
        }
        return;
    }
    for(int i = 1; i <= 5; ++i){
        cout << pos->first << endl;
        pos++;
    }
    cout << "..." << endl;
    pos = node[now].mp.end();
    for(int i = 0; i < 5; ++i)pos--;
    for(int i = 0; i < 5; ++i){
        cout << pos->first << endl;
        pos++;
    }
}
void UNDO(){
    if(v.empty()){
        cout << "ERR" << endl;
        return;
    }
    auto e = v[v.size() - 1];
    v.pop_back();
    int tmp = now;
    if(e.first == "MKDIR"){
        now = e.second.first;
        int u = node[now].mp[node[e.second.second].name];
        update(now, (-1)*node[u].sz);
        node[now].mp.erase(node[u].name);
        now = tmp;
    }else if(e.first == "RM"){
        now = e.second.first;
        int u = e.second.second;
        update(now, node[u].sz);
        node[now].mp[node[u].name] = u;
        now = tmp;
    }else{
        now = e.second.first;
    }
    cout << "OK" << endl;
}
void pushdown(int id);
void pretrack(int id){
    node[id].pre.push_back(node[id].name);
    if(node[id].sz == 1)return;
    if(node[id].sz <= 10){
        for(auto i:node[id].mp){
            if(!node[i.second].tag)pushdown(i.second);
            node[id].pre.insert(node[id].pre.end(), node[i.second].pre.begin(), node[i.second].pre.end());
        }
        return;
    }
    int cnt = 1;
    for(auto i:node[id].mp){
        if(!node[i.second].tag)pushdown(i.second);
        for(auto j:node[i.second].pre){
            node[id].pre.push_back(j);
            ++cnt;
            if(cnt >= 5)break;
        }
        if(cnt >= 5)break;
    }
}
void bcktrack(int id){
    int cnt = 0;
    auto iter = node[id].mp.end();
    --iter;
    for(;;--iter){
        if(!node[iter->second].tag)pushdown(iter->second);
        int u = iter->second;
        for(int i = node[u].bck.size() - 1; i >= 0; --i){
            node[id].bck.push_back(node[u].bck[i]);
            ++cnt;
            if(cnt >= 5){
                reverse(node[id].bck.begin(), node[id].bck.end());
                break;
            }
        }
        if(cnt >= 5)break;
        if(iter == node[id].mp.begin())break;
    }
}
void pushdown(int id){
    node[id].pre.clear();
    node[id].bck.clear();
    pretrack(id);
    if(node[id].sz > 10)bcktrack(id);
    else node[id].bck = node[id].pre;
    node[id].tag = 1;
}
void tree(){
    if(!node[now].tag)pushdown(now);
    if(node[now].sz == 1) cout << "EMPTY" << endl;
    else if(node[now].sz > 1 && node[now].sz <= 10){
        for(int i = 0; i < node[now].pre.size(); ++i)cout << node[now].pre[i] << endl;
    }
    else{
        for(int i = 1; i <= 5; ++i)cout << node[now].pre[i-1] << endl;
        cout << "..." << endl;
        for(int i = 5; i >= 1; --i)cout << node[now].bck[node[now].bck.size() - i] << endl;
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    mapp();
    cin >> T;
    while(T--){
        string sign, sname;
        cin >> Q;
        init();
        while(Q--){
            cin >> sign;
            switch (cmp[sign]){
                case 1:
                    cin >> sname;
                    mkdir(sname);
                    break;
                case 2:
                    cin >> sname;
                    RM(sname);
                    break;
                case 3:
                    cin >> sname;
                    CD(sname);
                    break;
                case 4:
                    SZ();
                    break;
                case 5:
                    ls();
                    break;
                case 6:
                    tree();
                    break;
                case 7:
                    UNDO();
                    break;
            }
        }
    }
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Week9—A—咕咕东的目录管理器 的相关文章

  • ubuntu 搜索安装包的命令

    1 sudo apt cache search XXX
  • ubuntu让开机就打开蓝牙

    我的ubuntu默认就有蓝牙功能 xff0c 也可以用 xff0c 但每次重启就很要重新打开蓝牙 xff0c 很烦恼 xff0c 解决办法如下 xff1a 1 sudo apt get install blueman bluez 2 vim
  • 【百度OCR】java调用百度OCR接口实现文字识别

    百度智能云文字识别 https ai baidu com 创建应用 参考博客 xff1a Java基于百度API接口实现智慧文字识别 百度AI开放平台 xff0c 文字识别接口 获取access token 百度AI 对接百度AI 增值税发
  • 使用某个用户登录命令:kinit adminad

    使用某个用户登录命令 xff1a kinit admin admin 票据生成方法 xff1a hdfs 票据 su hdfs klist hdfs rdspproduction 64 CARS COM 票据 然后切换到155机器 执行 s
  • Python3+Selenium框架搭建

    Webdriver概述 Webdriver Selenium2 xff09 是一种用于Web应用程序的自动测试工具 xff0c Thoughtworks公司一个强大的基于浏览器的开源自动化测试工具 xff0c 通常用来编写web应用的自动化
  • 算法题1:字符序列交换(阿里巴巴笔试题)

    题目 xff1a 若初始序列为gbfcdae xff0c 那么至少需要多少次两两交换 xff0c 才能使该序列变为abcdefg xff1f 任给一个自由a g这7个字母组成的排列 xff0c 最坏的情况下需要至少多少次两两交换 xff0c
  • 写给前端的 Nest.js 教程——10分钟上手后端接口开发

    前言 这个教程的所有代码我都放在了我的 GitHub 仓库 xff1a Nest CRUD Demo 1 xff0c 欢迎大家点个 Star xff01 框架简介 Nest 是一个用于构建高效 xff0c 可扩展的 Node js 服务器端
  • NSPredicate谓词搜索使用小记

    iOS中的搜索正常情况下用NSPredicate都足以解决问题 比如我们有一个原数组 dataArraty NSPredicate predicate 61 NSPredicate predicateWithFormat 64 span c
  • extern和volatile的用法

    extern 的用法 extern的用法的对象主要是变量和函数 用extern声明外部变量 什么是外部变量 外部变量是指在文件或者函数外部定义的全局变量 外部变量仅定义一次并且在所有的函数之外 在一个文件内使用外部变量 作用域 xff1a
  • 抽象数据类型定义(ADT)

    一 抽象数据类型定义 xff08 ADT xff09 作用 xff1a 抽象数据类型可以使我们更容易描述现实世界 例 xff1a 用线性表描述学生成绩表 xff0c 用树或图描述遗传关系 定义 xff1a 一个数学模型以及定义在该模型上的一
  • Keil串口仿真调试

    用到的软件 Keil开发软件 虚拟串口软件 串口调试小助手 软件介绍 1 虚拟串口软件 对于笔记本电脑来说 xff0c 没有自带串口使用虚拟串口软件可以模拟真实的串口 程序可以利用虚拟串口与其他串口交换数据 Virtual Serial P
  • Qt学习之路【5】:静态Qt库下SQLite数据库无法加载驱动(QSQLITE driver not loaded)

    使用的Qt库 Qt4 8 6 交叉编译工具链 xff1a arm linux gcc 4 3 6 这个问题纠结了好久 刚开始我使用的是Qt的动态库 xff0c 没有出现这个问题 现在使用的是Qt的静态库出现了这个问题 xff1a QSqlD
  • 【群晖nas】阿里域名DDNS 配置外网访问(华硕AC68U路由端口映射)

    拓扑图 友情提示 xff1a 其实 xff0c 华硕的路由是提供了免费域名的 具体步骤 确保路由器的WAN口IP为公网地址 在 路由器管理 系统设置 界面 xff0c 允许 从互联网设置RT AC88U 步骤1 高级设置 系统管理 系统设置
  • 使用"conn / as sysdba"登录时报出"insufficient privileges"错的问题

    1 xff09 conn as sysdba 的认证方式 oracle数据库的三种登录验证方式 xff1a 操作系统身份认证 密码文件认证 数据库认证 而conn as sysdba是属于操作系统认证 原理 xff1a 电脑开机时登录的用户
  • 数码管消影问题总结

    1 消影方法1 先送段选数据后送位选数据时 xff0c 需要在中间加入一条语句P0 61 0xff 作用是消影 现在来分析一下是怎样 产生影的 xff1f 当dula 61 0后锁住了P0口的数据 xff0c 即P0口仍然保持着上次的段选数
  • 【linux学习】ubuntu下挂载window共享文件

    ubuntu下挂载window共享文件实现文件共享 第一步 xff1a 将要共享的window文件夹共享 第二步 在ubuntu下进行挂载 xff0c 完整语法 xff0c 如下 xff1a 第一种方式 mount t cifs 192 1
  • ROM、SDRAM、RAM、DRAM、SRAM、FLASH 的区别

    ROM 和 RAM 指的都是半导体存储器 xff0c ROM 是 Read Only Memory 的缩写 xff0c RAM是 Random Access Memory的缩写 ROM 在系统体质供电的时候仍然可以保存数据 xff0c 而R
  • 软件开发技术文档编写规范

    在项目开发过程中 xff0c 应该按要求编写好十三种文档 xff0c 文档编制要求具有针对性 精确性 清晰性 完整性 灵活性 可追溯性 可行性分析报告 xff1a 说明该软件开发项目的实现在技术上 经济上和社会因素上的可行性 xff0c 评
  • insmod: can't insert 'led.ko': invalid module format详细解释

    insmod can 39 t insert 39 led ko 39 invalid module format 之前在Imx257学习版固件编写的驱动想直接移植imx257核心板的开发板上 以为2个板子的源码的引脚定义一样就没什么问题了
  • html媒体查询,同一个网页,在不同的条件下,使用不同的样式。

    媒体查询简述 设备 xff1a 屏幕 xff1a PC 手机端打印机屏幕阅读器 尺寸 xff1a 常见尺寸 320 420之间 响应式网页 xff1a 同一个网页 xff0c 在不同的条件下 xff0c 使用不同的样式 rem 百分比 xf

随机推荐

  • Anaconda3的安装和详细介绍(带图文)

    Anaconda的安装和详细介绍 xff08 带图文 xff09 Anacond的介绍 Anaconda指的是一个开源的Python发行版本 xff0c 其包含了conda Python等180多个科学包及其依赖项 因为包含了大量的科学包
  • vue项目引入less文件

    如果需要在vue项目中使用 less文件 xff0c 首先需要安装less和less loader依赖包 xff0c 这个 less文件相当于以前web项目的css文件 xff0c 有三种引入方式 xff1a 方式一 xff1a 在vue界
  • 新的开始

    这是第一次写博客 xff0c 也算是一个新的开始 今天就是写一些自己学到的内容 xff1a 今天接触了冒泡排序法 xff0c 还是能够接受的 1 init function var a 61 10 30 20 40 15 5 25 var
  • 【群晖nas】raidrive 极简教程

    1 群晖套件重心下载并配置 webDav server 2 raidrive连接群晖 xff0c 本地化使用 网盘下载 链接 xff1a https pan baidu com s 1eP9zBjlPjmL2 0MlWUlS3A 提取码 x
  • ubuntu20.04安装jenkins教程步骤-官方

    Debian Jenkins Packages Jenkins Debian Packages This is the Debian package repository of Jenkins to automate installatio
  • 编译mnistCUDNN时出错:fatal error: FreeImage.h: No such file or directory

    编译mnistCUDNN时出错 xff1a fatal error FreeImage h No such file or directory 在测试CUDNN是否正常使用时候报错 测试CUDNN8 1是否正常使用 1 在https dev
  • elementUI+MybatisPlus日期查询

    elementUI 43 MybatisPlus日期查询 1 前端设置 在el date picker组件加入value format 61 34 yyyy MM dd 34 xff0c 选择日期后 xff0c 将值自动保存为yyyy MM
  • Linux(centos7.5)下安装node.js

    Linux xff08 centos7 5 xff09 下安装node js 进入node的中文站点http nodejs cn download 并选择需要安装的版本链接 使用XShell上传到Linux中 xff0c 目录 opt so
  • typora中图片左对齐

    使用typora很久了 xff0c 但是它的图片一直是居中 xff0c 我这个人有左对齐强迫症 xff0c 想要图片左对齐 typora左对齐很简单 xff0c 打开主题的css文件 在最下面添加上如下代码 xff0c 保存后重启typor
  • Typora的引用设置多种样式

    设置引用多样式 此教程在很多人的反馈下 xff0c 有修改后有问题 xff0c 可能是版本不兼容 我下载的是 Typora version 0 10 10 xff08 beta xff09 版本 xff0c 有的人也是用此版本才修改成功的
  • MySQL安装最后一步卡死了

    今天给老师安装mysql 5 5 版本时出了问题 xff0c 老师的电脑系统为Windows7 xff0c MySQL安装版本为mysql 5 5 安装到最后一步 xff08 MySQL实例配置最后一步卡死了 xff09 xff0c 安装了
  • Element不能自动换行,内容依然超出,直到遇见空格自动换行

    我一个前端技术小白 xff0c 不会前端 xff0c 没办法 xff0c 只能使用别人做好的框架 在最近项目使用Element xff0c 需求是要显示日志 xff0c 日志表格中显示一串SQL 但是 xff0c 在使用过程中 xff0c
  • Oracle数据库锁表解锁

    以下几个为相关表 SELECT FROM V LOCK SELECT FROM V SQLAREA SELECT FROM V SESSION SELECT FROM V PROCESS SELECT FROM V LOCKED OBJEC
  • Android4.3 user版本提权root

    Android user版本提权root xff1a 软件版本 xff1a android4 3 硬件平台 xff1a marvell 方案一 xff1a 第一步 xff0c 修改adb c xff0c 添加可执行程序 xff0c 完成ro
  • Apsara Clouder云计算专项技能认证:云服务器ECS入门题库

    Apsara Clouder云计算专项技能认证 xff1a 云服务器ECS入门题库备份一下 xff1a 以下加粗的部分为正确答案 xff0c 本人得分90分 xff08 60分及格 xff09 xff0c 如有错误 xff0c 也欢迎指正
  • 读写文件与结构体数组结合

    include lt stdio h gt include lt stdlib h gt include lt string h gt define MAXSIZE 1024 define N 5 typedef struct char c
  • 【PyQt5】python3.7+Qt+pycharm环境搭建->初建项目->生成可执行文件(图多)

    文章目录 目标环境准备python搭建下载安装pip更新PyQt5安装pyinstaller安装pyqt5 tools Qt搭建下载安装 pycharm搭建下载安装配置python配置qtdesigner配置pyGUI配置pyRC资源 初建
  • CSP补题—A—咕咕东的奇遇—B—咕咕东想吃饭

    一 xff21 咕咕东的奇遇 题目描述 xff1a 咕咕东是个贪玩的孩子 xff0c 有一天 xff0c 他从上古遗迹中得到了一个神奇的圆环 这个圆环由字母表组成首尾相接的环 xff0c 环上有一个指针 xff0c 最初指向字母a 咕咕东每
  • Week8—C—班长竞选(强连通子图 SCC)

    题目描述 xff1a 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也
  • Week9—A—咕咕东的目录管理器

    题目描述 xff1a Input xff1a 输入文件包含多组测试数据 xff0c 第一行输入一个整数表示测试数据的组数 T xff08 T lt 61 20 xff09 xff1b 每组测试数据的第一行输入一个整数表示该组测试数据的命令总