2014年首届CCF软件能力认证试题第三题_(8分)我省某校园内放着一个校园雕塑,如下图所示,老师想测试一下小明解决问题的能力,他这样告诉小明,-程序员宅基地

技术标签: 算法  命令行  CCF认证  

题目3 命令行选项
时间限制: 1 秒
空间限制: 256 MB
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。
每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字
符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用
对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一
些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数
选项的形式是一个减号后面跟单个小写字母,如”-a” 或”-b”。而带参数
选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相
同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如,”ab:m:” 表示该程序接受三种选项,即”-a”(不带参数),”-b”(带参数),
以及”-m”(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超
过52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一
次,不会有两个相邻的冒号,也不会以冒号开头。输入的第二行是一个正整数N(1 N 20),表示你需要处理的命令行的个数。
接下来有N 行,每行是一个待处理的命令行,它包括不超过256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式:
输出有N 行。其中第i 行以”Case i:” 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出现了多次,只输出最后一次出现时所带的参数。

思路:
字符串处理的题目,要很小心=.=
一开始是解析规则字符串rule,因为命令只可能是小写字母,所以用哈希表记录每一个命令的使用规则(0 没有这个码;1 有这个码不能接参数;2 接参数 )
接下来是处理输入的字符串,根据上面的规则来处理。相同命令只输出一次,要检查前面是否已经输出该命令,输出参数是注意修改前面命令的参数(因为只输出最后一个参数)。遇到不符合的情况就退出,结束解析。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    int i,j,cnt;
    char cc;
    std::vector< std::vector<string> > res;
    string clause[20][256];
    //memset(clause,"",sizeof(string)*20*256);
    for(i=0;i<20;i++){
    for(j=0;j<256;j++){
    clause[i][j] = "";
    }
    }
    map<char,int> map;//0 没有这个码;1 有这个码不能接参数;2 可以接参数 
    for(char ch='a';ch <= 'z';ch++){
       map.insert(pair<char,int>(ch,0));
    }
    string rule;
    //处理规则 
    cin>>rule;
    for(i=0;i<rule.length()-1;i++){
      if(rule[i]>='a'&&rule[i]<='z'&&rule[i+1]==':'){
          map[rule[i]]=2;
          continue;
      }
      else {
          map[rule[i]]=1;
      }
    }
    if(rule[rule.length()-2]==':') map[rule[rule.length()-1]]=1;
    else if(rule[rule.length()-1]==':') map[rule[rule.length()-2]]=2;
    else map[rule[rule.length()-1]]=1;
    //读入命令 
    cin>>cnt;
    scanf("%c", &cc);
    int cn = 0,num=0;
    while(cnt){
    char buffer;
    string s;
    i=0;
    //输入命令 
    while(scanf("%c", &buffer)){
    if(buffer=='\n') break;
    else if(buffer==' ') i++;
    else clause[cn][i] += buffer;    
    }
    // 处理命令 
    vector<string> ans;
    num=i;
    i=1;
    for(i=1;clause[cn][i]!="";i++){
    if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==0) break;
    else if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==1) {

         if(find( ans.begin( ), ans.end( ), clause[cn][i] )==ans.end()) ans.push_back(clause[cn][i]);
         }  
    else if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==2) {

         if(find( ans.begin( ), ans.end( ), clause[cn][i] )==ans.end()) ans.push_back(clause[cn][i]);
         if(clause[cn][i+1]!=""&&clause[cn][i+1][0]!='-') {
         if(ans[ans.size()-1]==clause[cn][i]) ans.push_back(clause[cn][i+1]);
         else *(find( ans.begin( ), ans.end( ), clause[cn][i] )+1) = clause[cn][i+1];
         i++;
         continue;
         }
         else break;
         }
    else break; 
    }
    res.push_back(ans);

    cn++;
    cnt--;
    }

    for(i=0;i<res.size();i++){
     cout<<"Case "<<i+1<<": ";
    for(j=0;j<res[i].size();j++){
     cout<<res[i][j]<<" ";
    }
    cout<<endl;
    }


    system("pause");
    return 0;
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iboxty/article/details/44701147

智能推荐

获取Form.ShowDialog() 出的窗体中textbox的返回值_this.getformref().-程序员宅基地

文章浏览阅读540次。转自 : http://blog.csdn.net/piaofengxiyue/article/details/4494382经常会遇到ShowDialog出的窗体中有一些textbox,输入完后返回到主窗体中。怎么办呢?有办法。 理论上讲ShowDialog后的窗体返回值类型是DialogResult。也就是一个枚举值,只有yes,no,ok之类的值,肯定是不_this.getformref().

Android基础——类加载器和动态加载_动态加载aar-程序员宅基地

文章浏览阅读1.7k次。关于动态加载和类加载器的简单理解_动态加载aar

HTML5——history实现单页面_单个html文件怎么实现单页面应用-程序员宅基地

文章浏览阅读2.5k次。1. 单页Web应用(single page web application,SPA)history.back():URL回退一次history.forward():URL前进一次history.go(n):URL几次history.back()或几次history.forward(),比如:history.go(2):两次history.forward();history.go(-2..._单个html文件怎么实现单页面应用

XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax...-程序员宅基地

文章浏览阅读195次。本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件XML来源SGMLSGML(SGM)标准通用标记语言是一种定义电子文档结构和描述其内容的国际标准语言,具有极好的扩展性是所有电子文档标记语言的起源,早在万维网发明之前“通用标言”就已存在是1..._public int toolremindertotal()的xml如何写

工控机主机该怎么加固_工控机用固定-程序员宅基地

文章浏览阅读2.9k次。工控安全现状工业控制系统是支撑国民经济的重要设施,是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域,支撑起国计民生的关键基础设施。随着传统的工业转型,数字化、网络化和智能化的工业控制系统逐渐接入互联网,病毒、木马、蠕虫、僵尸网络等常见威胁也威胁到工业控制系统的安全。近几年,勒索病毒的出现,在企业损失大量数据的情形下,也对企业造成了不可估量的经济损失。目前,企业会在工业控制系统的外围建立防火墙、入侵检测系统、入侵防御系统等技术控制手段,同时也会采用不必.._工控机用固定

小米商城项目总结_小米商城项目总结心得-程序员宅基地

文章浏览阅读7.2k次。脚本中判断是否相等不能用equals,没有这个方法,只能用== 数据库工具类,只需要加载一次就够了,所以我们采用静态代码块来初始化该方法,作为工具类使用 public static QueryRunner qr = null;//因为是在不同包下的,所以要用public才可以调用 Ajax往Servlet发送数据的时候Servlet必须response一个数据,不然会报parsee..._小米商城项目总结心得

随便推点

JS 系列之 事件—表单事件_js input event-程序员宅基地

文章浏览阅读2.6k次。今天跟大家分享一下JS系列之表单事件。1 表单事件的种类1.1 input 事件input事件当、、的值发生变化时触发。对于复选框()或单选框(),用户改变选项时,也会触发这个事件。另外,对于打开contenteditable属性的元素,只要值发生变化,也会触发input事件。input事件的一个特点,就是会连续触发,比如用户每按下一次按键,就会触发一次input事件。input事件对象..._js input event

菜单下拉条-程序员宅基地

文章浏览阅读82次。最近 ,用到了一些js的知识,稍微复习了下,还把之前写的js代码又复习了一遍,这里贴上来!<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http:/..._菜单下拉条

Windows Terminal完整指南-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏29次。在本文中,我们将探讨Windows Terminal,它是WSL2的理想配套。它速度快、可配置、外观漂亮,并且提供了Windows和Linux开发的所有优点。Windows已经完全接受了Linux,而WSL2使它成为一种无缝的乐趣。你可以通过以下方式访问发行版的终端:单击其开始菜单图标在Powershell或命令提示符下输入 wsl 或 bash通过启动 %windir%\system32\bash.exe ~ 的配置文件使用第三方终端选项(例如Cmder,ConEmu和Hyper)在VS .

To install them, you can run: npm install --save core-js/modules/es.array.push.js-程序员宅基地

文章浏览阅读5k次,点赞5次,收藏8次。To install them, you can run: npm install --save core-js/modules/es.array.push.js core-js/modules/es.error.cause.js core-js/modules/es.object.proto.js core-js/modules/es.re

wpf 界面切换-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏30次。界面切换和窗口跳转是所有桌面程序都需要的。 wpf里面也有很多方法来做到界面切换,简单常用的有TabControl和UserControl。TabControl优点是简单,继续拖控件。 缺点就是全部代码会堆到一起。代码&lt;TabControl HorizontalAlignment="Left" Height="200" Margin="10,10,0,0" Vert...

win10 vmware 磁盘映射 位置不可用_vmware映射虚拟磁盘 不可用-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏22次。原文链接:https://www.itsk.com/thread-395102-1-1.html出现Z:\不可用。如果该位置位于这台电脑上,请确保设备或驱动器已连接,或者光盘已插入,然后重试。如果该位置位于网络上,请确保你已连接到网络或Internet,然后重试。如果仍然找不到该位置,则它可能已移动或删除。解决办法:主要是因为新版WIN10的资源管理不是以管理员身份运行的,这时候只需要打开任务管理器,结束Windows资源管理器的进程,再点左上角文件,运行新任务,打开C:\Windows\exp._vmware映射虚拟磁盘 不可用

推荐文章

热门文章

相关标签