AcWing 3199. 命令行选项
原题链接
中等
作者:
孙鹏宇.
,
2024-04-14 14:28:14
,
所有人可见
,
阅读 19
#include<bits/stdc++.h>
using namespace std;
const int N = 30; //选项字母个数最多26个
bool o1[N], o2[N]; //o1存无参选项,o2存带参选项
string ans[N]; //答案
int n;
int main()
{
//cin.tie(nullptr)->sync_with_stdio(false);
//读入一下 该命令的选项组成
string s; cin >> s;
//解析一下选项
for (int i = 0; i < s.size(); i++)
{
//如果该选项后面是冒号,说明是带参选项
if (i + 1 < s.size() && s[i + 1] == ':') //防止越界
{
o2[s[i]-'a'] = true; //标记为有参选项
i++; //跳到下一个选项
}
else
{
o1[s[i]-'a'] = true; //否则就标记为无参选项
}
}
cin >> n;
getchar(); //把上面读入遗留的回车读取掉
//string str;
for (int C=1;C<=n;C++)
{
printf("Case %d:",C);
getline(cin,s);//读入n条命令
//把每一条命令的每个选项都取出来
stringstream ssin(s);
vector<string>ops;
while (ssin>>s)
{
ops.push_back(s);
}
//把ans清空
for (int i = 0; i < 26; i++)ans[i].clear();
//第0个是命令我们不处理,跳过0,从1开始处理选项
for (int i = 1; i < ops.size(); i++)
{
//每个选项都至少有两部分组成 :
// - 字母 参数(选)
if (ops[i][0] != '-' || ops[i][1] < 'a' || ops[i][1] > 'z' || ops[i].size() != 2)break;
int k = ops[i][1] - 'a'; //保存一下选项
//判断一下选项是带参选项 还是 无参选项
if (o1[k]) ans[k] = "*"; //无参选项
else if (o2[k] && i + 1 < ops.size()) //带参选项
{
ans[k] = ops[i + 1]; //保存一下参数
i++; //跳过参数
}
else break; //否则参数不合法,跳过
}
for (int i=0;i<26;i++)
{
if (ans[i].size()) //如果答案不为空
{
cout <<" -" << char(i + 'a'); //输出选项
if (o2[i]) //如果带选还要再输出个空格 再输出参数
{
cout << ' ' << ans[i];
}
}
}cout << endl;
}
return 0;
}