Day2

题目描述

请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。

每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。

这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。

在工具名字之后可能会包含若干选项,然后可能会包含一些不是选项的参数。

选项有两类:带参数的选项和不带参数的选项。

一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如 -a-b

而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。

该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。

这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。

如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。

例如,ab:m: 表示该程序接受三种选项,即 -a(不带参数),-b(带参数),以及 -m(带参数)。

命令行工具的作者准备了若干条命令行用以测试你的程序。

对于每个命令行,你的工具应当一直向后分析。

当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。

命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式

输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 \(52\)

格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。

输入的第二行是一个正整数 \(N\),表示你需要处理的命令行的个数。

接下来有 \(N\) 行,每行是一个待处理的命令行,它包括不超过 \(256\)个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式

输出有 \(N\) 行。其中第 \(i\) 行以 Case i:开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。

如果一个选项在命令行中出现了多次,只输出一次。

如果一个带参数的选项在命令行中出现了多次,只输出最后一次出现时所带的参数。

数据范围

\(1≤N≤20\)

对于每组数据,所有命令行工具的名字一定相同,且由小写字母构成。

输入样例:

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

输出样例:

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

题目分析

模拟题 字符串处理

hash表映射记录带不带参数即可,字典序排列用map内部的默认排序即可,剩下的就是字符串分割处理,模仿python3 中的 split()函数实现字符串分割即可,然后参数一个个判断

C++代码

注意用C++17可以用auto [k , v] : map遍历

C++14不支持,只能auto pair : map 或者 for(map<string , string>::iterator it = map.begin() ; it != map.end() ; it ++)遍历

C++代码

C++14

#include <bits/stdc++.h>
using namespace std; string op;
map<string , int> opera; int n;
string line; vector<string> substr(string line)
{
vector<string> ans;
for(int i = 0 ; i < line.size() ; i ++)
{
string word = "";
while(i < line.size() && line[i] != ' ') word = word + line[i ++];
ans.push_back(word);
}
return ans;
} int main()
{
cin >> op;
cin >> n;
for(int i = 0 ; i < op.size() ; i ++)
{
string res = "-" + op.substr(i , 1);
if(op[i + 1] == ':')
opera[res] = 1 , i ++;
else opera[res] = 2;
}
getline(cin , line);
for(int l = 1 ; l <= n ; l ++){
getline(cin , line);
vector<string> ops = substr(line);
map<string , string> res;
for(int i = 1 ; i < ops.size() ; i ++)
{
if(opera[ops[i]] == 0) break;
else if(opera[ops[i]] == 2) res.insert({ops[i] , ""});
else
{
if(i + 1 >= ops.size()) break;
res[ops[i]] = ops[i + 1] , i ++;
}
}
cout << "Case " << l << ":";
for(auto it : res)
if(it.second != "") cout << " " << it.first << " " << it.second;
else cout << " " << it.first;
cout << endl;
}
return 0;
}

C++17

#include <bits/stdc++.h>
using namespace std; string op;
map<string , int> opera; int n;
string line; vector<string> substr(string line)
{
vector<string> ans;
for(int i = 0 ; i < line.size() ; i ++)
{
string word = "";
while(i < line.size() && line[i] != ' ') word = word + line[i ++];
ans.push_back(word);
}
return ans;
} int main()
{
cin >> op;
cin >> n;
for(int i = 0 ; i < op.size() ; i ++)
{
string res = "-" + op.substr(i , 1);
if(op[i + 1] == ':')
opera[res] = 1 , i ++;
else opera[res] = 2;
}
getline(cin , line);
for(int l = 1 ; l <= n ; l ++){
getline(cin , line);
vector<string> ops = substr(line);
map<string , string> res;
for(int i = 1 ; i < ops.size() ; i ++)
{
if(opera[ops[i]] == 0) break;
else if(opera[ops[i]] == 2) res.insert({ops[i] , ""});
else
{
if(i + 1 >= ops.size()) break;
res[ops[i]] = ops[i + 1] , i ++;
}
}
cout << "Case " << l << ":";
for(auto [k , v] : res)
if(v != "") cout << " " << k << " " << v;
else cout << " " << k;
cout << endl;
}
return 0;
}

Day2 备战CCF-CSP练习的更多相关文章

  1. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  2. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  3. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  4. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  5. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  6. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  7. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  8. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  9. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  10. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

随机推荐

  1. FastAPI与Tortoise-ORM实现关系型数据库关联

    title: FastAPI与Tortoise-ORM实现关系型数据库关联 date: 2025/04/21 10:51:41 updated: 2025/04/21 10:51:41 author: ...

  2. EF ——left join

    如何在EF中实现left join(左联接)查询_ var TestList = from p in context.PersonalInformation join d in context.Dep ...

  3. 119K star!无需GPU轻松本地部署多款大模型,DeepSeek支持!这个开源神器绝了

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "只需一行命令就能在本地运行Llama 3.DeepSeek-R1等前沿大模型,支 ...

  4. jsp页面的跳转

    服务器端和客户端跳转 服务器端跳转不改变URL,服务器的行为 客户端跳转改变URL,客户端的行为 项目目录 index.jsp <%@ page language="java" ...

  5. svg标签元素定位最有效的办法

    随着前端技术发展,svg(可伸缩矢量图形 )在前端应用中广泛被使用,然而采用传统的xpath元素定位方法已经无法对其进行定位,我们需要将svg标签及其包含的子标签用以下方式表达: *[name()=& ...

  6. 1-1, 一个简单的mysql 安装教程,基于mysql 5.7解压版本.

    下载mysql. 略,去官网 1. 配置my.cnf. 把mysql提供的配置模板 copy到/etc/my.cnf (先读取/etc/my.cnf,再去读/etc/mysql/my.cnf,第三个读 ...

  7. 高德API获取省市区---python3实现

    # -*- coding: utf-8 -*- """ Created on Thu Nov 4 15:40:25 2021 @author: 何双新 "&qu ...

  8. Java 代码块与代码加载顺序

    本文首先介绍几个基本的名次,然后介绍了三种代码块的特性和使用方法. 在面试大型公司时,如果遇到大型国企或者大的互联网私企,笔试中经常遇到代码块和代码加载顺序的笔试题.这里做一个总结,也方便各位小伙伴飙 ...

  9. Go交叉编译

    #在Mac上编译linux平台应用 GOOS=linux GOARCH=amd64 go build hello.go #在Windows上编译linux平台应用(关闭CGO) CGO_ENABLED ...

  10. Ribbon过滤器原理解析

    Ribbon过滤器整体看是一个矩阵构建与矩阵乘法,RocksDB中对它的实现是进行了合理的空间.时间上的优化的. 符号 整个过滤器都和矩阵计算CS=R相关,C是\(n*n\)矩阵,S是\(n*m\)矩 ...