试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<char,int>mp;
map<char,string>ans;
string str;
vector<string>ve;
void tostrtok(string line){
int t;
for(t = line.find(" "); t != string::npos; t = line.find(" "))
{
ve.push_back(line.substr(0,t));
line = line.substr(t+1);
}
ve.push_back(line);
return;
}
int main(){
int n;
cin>>str;
for(int i=0;i<str.size();i++){
if(str[i]==':')mp[str[i-1]]++;
else mp[str[i]]++;
}
cin>>n;
getchar();
string ip;
for(int ii=1;ii<=n;ii++){
ve.clear();
ans.clear();
getline(cin,ip);
tostrtok(ip);
for(int i=1;i<ve.size();i++){
if(ve[i][0]=='-'&&ve[i].size()==2&&(ve[i][1]<='z'&&ve[i][1]>='a')&&mp[ve[i][1]]==1){
ans[ve[i][1]]="";
}
else if(ve[i][0]=='-'&&ve[i].size()==2&&(ve[i][1]<='z'&&ve[i][1]>='a')&&mp[ve[i][1]]==2){
if(i+1==ve.size())break;
string temp=ve[i+1];
ans[ve[i][1]]=temp;
i++;
}
else break;
}
cout<<"Case "<<ii<<":";
for(auto it:ans){
cout<<" -"<<it.first;
if(it.second!="")cout<<" "<<it.second;
}
cout<<endl;
}
return 0;
}