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”的形 ...
随机推荐
- [开源] .Net 使用 ORM 访问 神舟通用数据库(神通)
前言 天津神舟通用数据技术有限公司(简称"神舟通用公司"),隶属于中国航天科技集团(CASC).是国内从事数据库.大数据解决方案和数据挖掘分析产品研发的专业公司.公司获得了国家核高 ...
- Graphpad Prism10.1.2 中文版科学绘图软件 安装包下载
Prism10中文版下载链接: https://pan.baidu.com/s/18a0_uLi3ANWC3KxlHOzZAA?pwd=6666 提取码: 6666 Graphpad Prism 是一 ...
- 使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习
使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习 概述 本文将指导您如何利用 Podman Desktop 安装时提供的 WSL2 环境 ...
- Java日期格式化中的“YYYY”陷阱:为什么跨年周会让你的年份突然+1?.md
结论先行 在Java中使用 YYYY-MM-dd 格式化日期时,若日期所在的周跨年,年份可能会被错误计算为下一年(如2021年12月26日显示为2022年).而使用 yyyy-MM-dd 会始终返回正 ...
- 27.7K star!这个SpringBoot+Vue人力资源管理系统,让企业开发事半功倍!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "只需一个脚手架,轻松搭建企业级人事管理系统!" 微人事(vhr)是一款 ...
- Java编程——设计模式目录
目录 学习指导 https://java-design-patterns.com/zh/patterns/
- SpringBoot3整合SpringSecurity6(三)基于数据库的用户认证
大家好,我是晓凡. 写在前面 上一篇文章中,我们了解了SpringSecurity怎么基于内存进行用户认证.但这还远远不够,在实际开发中. 用户往往都存在于数据库,所以从这篇文章开始,我们就要开始学习 ...
- B1009 说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...
- acwing 智商药
题目链接:5046. 智商药 - AcWing题库 首先考虑dfs 不用想肯定超时 过了10/17个测试点 代码 1 #include<bits/stdc++.h> 2 3 using n ...
- PC端自动化测试实战教程-7-pywinauto等待方法大集合 (详细教程)
1.简介 经过上一篇的学习和讲解想必小伙伴或者童鞋们已经意识到等待的重要性了吧.宏哥在上一篇中在start()后,加入适当的等待时间(如time.sleep()),让应用程序有足够的时间初始化窗口和U ...