题目描述:
解题思路:
首先,大模拟的题目首先要想好怎么存储数据的问题!这个问题解决了整个问题也就迎刃而解了!
- 先处理初始字符串,设置两个布尔数组o1[],o2[]分别表示不带参数和带参数的命令,将a到z映射到数组的0到25中!满足要求将布尔数组置为true,后面我们逐个判断命令,去布尔数组中查找,如果是true则将答案数组ans[]的对应位置放个字符串做标记!
- 因为要按字母表顺序进行输出!所以我们可以将a到z映射到数组ans的0到25中,最后我们就可以从头查找,只要满足要求输出下标char(i+‘a’)即可!
- 字符串的处理问题:首先用getline(cin,s)获取整个字符串,(这里!如果要用getline记得用getchar()获取n后的换行符号)然后放到字符流stringstream中,再逐个获取以空格分开的字符串!很方便!此处附上stringstream类的学习地址stringstream的基本用法 - propheteia - 博客园
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=30;
string S;
int n;
bool o1[N],o2[N]; //转化到数组中
vector<string> ans[N]; //将结果映射到数组里面,可以使得输出是按照字母表顺序。
int main()
{
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(); //如果后面要用getline(cin,s)这里要记得getchar();
for(int i=1;i<=n;i++)
{
string s;
getline(cin,s);
stringstream ssin(s); //字符流
vector<string> temp;
while(ssin>>s) temp.push_back(s);
for(int j=0;j<=26;j++) ans[j].clear(); //记录答案
for(int j=1;j<temp.size();j++)
{
if(temp[j][0]!='-'||temp[j].size()!=2||temp[j][1]<'a') break;
int t=temp[j][1]-'a';
if(o1[t]) ans[t].push_back("**"); //随便给一个字符串做标记
else if(o2[t]&&j+1<temp.size()) ans[t].push_back(temp[j+1]),j++;
else break;
}
cout<<"Case "<<i<<":";
for(int k=0;k<26;k++)
{
if(ans[k].size()) //只要当前位置有字符串即可
{
cout<<" -"<<char(k+'a');
if(o2[k]) cout<<" "<<ans[k].back(); //输出最后一个字符串
}
}
cout<<endl;
}
return 0;
}