Day2 备战CCF-CSP练习
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练习的更多相关文章
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201703
CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201409-3 字符串匹配
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...
- CCF CSP 201503-3 节日
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...
随机推荐
- 我们离Agent终极形态又近了一步:全球首个支持谷歌A2A(Agent-to-Agent)协议的智能体注册网站上线Product Hunt,未来智能体协作网络
AI 的终点,不是更强大的对话,而是一个真正协作的智能体社会. 这种形态已经在悄然出现. 全球首个支持 Google A2A(Agent-to-Agent)协议 的智能体注册与协作平台同步上线Prod ...
- 【BUG】未能加载文件或程序集“System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyT
参考:无法加载文件或程序集System.Runtime.CompilerServices.Unsafe. 问题 我的环境: Visual Studio 2019 出错代码: MSBuildWorksp ...
- 在鸿蒙NEXT中实现完全自定义导航栏
在日常app开发中,导航栏扮演着重要的角色.鸿蒙提供了系统导航栏Navigation,它支持很多属性的修改,但是应用需求更加灵活多变,比如有的导航栏有背景图片,有的导航栏要求渐变色,有的导航栏需要随时 ...
- SOUI2-布局系统
布局系统 每个UI界面都是由大量的界面元素构成的,在window编程中,这些界面元素的最小单位被称为控件,而布局则是这些控件在界面的相对位置和大小. 目前SOUI支持锚点布局.线性布局.网格布局,下面 ...
- 网络编程:反应堆_I/O模型和多线程模型实现
多线程设计的几个考虑 在反应堆reactor框架设计中,main reactor线程是一个acceptor线程,这个线程一旦创建,会以event_loop形式阻塞在event_dispatcher的d ...
- LocalSend 编译全过程深度讲解,解决手机与电脑互传文件痛点
localsend编译 LocalSend 是一款开源.跨平台的 本地网络文件传输工具,旨在通过局域网实现设备间快速.安全的文件共享,无需依赖互联网或第三方服务器.它支持 Windows.macOS. ...
- 前n项结尾0的个数
题目链接:K-卡特兰数_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com) 一开始想到和阶乘末尾0的个数一样的题目,但有点不同,根据公式,一开始的重点完全在公式上了,因为前几项 ...
- 聊一聊 .NET Dump 中的 Linux信号机制
一:背景 1. 讲故事 当 .NET程序 在Linux上崩溃时,我们可以配置一些参考拿到对应程序的core文件,拿到core文件后用windbg打开,往往会看到这样的一句信息 Signal SIGAB ...
- ubuntu22.04使用libmysqlclient-dev,在包含mysql.h时会出现‘net_async_status’未声明
//mysql Ver 8.0.41-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu)) //库文件是libmysqlclient-dev //在使用 g+ ...
- 按下 F12 打开开发者工具,它凭什么能监控所有网络请求?
兄弟们,咱们天天跟浏览器打交道,F12 可能比键盘上其他任何一个功能键按得都多.我们习惯了在 Network 面板里看着请求瀑布流,调试 API,分析性能. 但你有没有停下来,哪怕一次,问过自己一个问 ...