CCF 201403-3 命令行选项 (恶心的模拟)
2015-09-04 20:13
330 查看
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
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
一开始用二维数组做,一直卡在70分,不清楚哪儿没考虑到。后面参考了别人的代码,改用map来搞了。
坑点:
1、要处理的命令行中会出现 -abc这种选项,当然这是不合法的
2、样例中已经出现:即只含有一个工具名的情况(case2)以及既不是含有'-'的选项,也不是合法参数(case1)。
3、参数不一定就是数字
4、最后输出要排一下序
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
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
一开始用二维数组做,一直卡在70分,不清楚哪儿没考虑到。后面参考了别人的代码,改用map来搞了。
坑点:
1、要处理的命令行中会出现 -abc这种选项,当然这是不合法的
2、样例中已经出现:即只含有一个工具名的情况(case2)以及既不是含有'-'的选项,也不是合法参数(case1)。
3、参数不一定就是数字
4、最后输出要排一下序
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; char s[300]; map<char,int> o,a; map<char,string> m; int main() { cin>>s; int i,j,n; for(i=0;s[i]!=0;++i) if(s[i]==':') o[s[i-1]]++; else o[s[i]]++; cin>>n; getchar(); for(i=1;i<=n;++i) { a.clear(); m.clear(); gets(s); printf("Case %d:",i); for(j=1;s[j]!=' '&&s[j]!=0;++j); if(s[j]==0) {puts("");continue;} while(s[j]!=0) { if(s[++j]!='-') break; if(o[s[++j]]==0) break; if(o[s[j]]==1) { if(s[j+1]==' '||s[j+1]==0) a[s[j++]]=1; else break; } else if(s[j+1]==' '&&s[j+2]!=0) { a[s[j]]=2; string tmp=""; int tm=j; for(j=j+2;s[j]!=0&&s[j]!=' ';++j) tmp+=s[j]; m[s[tm]]=tmp; } else break; } map<char,int>::iterator it; for(it=a.begin();it!=a.end();++it) { cout<<" -"<<it->first; if(it->second==2) cout<<' '<<m[it->first]; } puts(""); } return 0; }
相关文章推荐
- HDU 3709 Balanced Number
- Android Service与Activity之间通信的几种方式
- 《剑指Offer》面试题:反转链表
- python字符串:
- HDU5045-Contest(状压dp)
- 在VS2012下创建单元测试项目
- 【转】如何使用Notification功能
- python & opencv 环境搭建
- Codeforces 550 C. Divisibility by Eight
- Linux LVM简明教程
- 两个IP实现IIS和Apache公用80端口的设置方法
- [刷题]Hash Function
- 51nod 求子段和问题总结(DP)
- Objective-C( Foundation框架 一 常见的结构体)
- Kinect v2.0原理介绍之九:高清面部帧(2) 面部特征对齐
- 利用lombok中的注解消除javabean代码冗余
- 隐式转换和显式转换及强制转换的区别
- MANACHER 最长回文序列
- Spring MVC和Struts2的区别
- Symfony2模版引擎使用说明手册