CCF-201403-3
通过这个题目我认识一下sstream和getline()

让我们看看题目怎么说

解题思路
1.首先我们要把第一行的字母提取出来,分辨出每个字母是带参的还是不带参的,可以使用两个vector,两个set,我们这里使用的是一个map,set在这里原则上会好于vector,因为set有find函数,这样查找的时候会方便,不多说,此题我们使用了map来存贮字母,1表示带参,0表示不带参
2.每一行的输入要使用到getline,然后把getline里面的string提取出来,我们使用到了sstream中的stringstream。
需要注意的是:在getline()前要先读入一个空格,我们使用getchar()或者cin.ignore()都可以,这里我们使用了后者
3.由于输入的字母需要排序,所以我们用set来存贮输出的结果
在每次输入前,查询的map-m,和存储的set-ans和输入输出流ss都需要clear()
4.失分点:如果带参的字母后面参数为空,那么这个参数报错,需要break;
5.失分点:ss.str(str) 不能用ss<<str代替,不然只能拿10分。
代码是这样的
#include<iostream>
#include<cstring>
#include<sstream>
#include<map>
#include<set>
using namespace std;
int main(){
stringstream ss;
map<char,int> symbol;
map<string,string> m;
set<string> ans;
string str;
cin>>str;
for(int i=0;i<str.length();i++){
if(str[i+1]==':'){
symbol[str[i]]=1;
i++;
}else{
symbol[str[i]]=0;
}
}
int n;
cin>>n;
cin.ignore();
for(int i=1;i<=n;i++){
string temp;
getline(cin,str);
m.clear();
ans.clear();
ss.clear();
ss.str(str);
ss>>temp;
while(ss>>temp){
if(temp[0]=='-'){
if(symbol.find(temp[1])!=symbol.end()){
if(symbol[temp[1]]==1){
string temp2;
ss>>temp2;
if(temp2.empty()) break;
m[temp]=temp2;
}
ans.insert(temp);
}
else break;
}
else break;
}
cout<<"Case "<<i<<": ";
for(set<string>::iterator it=ans.begin();it!=ans.end();it++){
cout<<*it<<" ";
if(m.find(*it)!=m.end()){
cout<<m[*it]<<" ";
}
}
cout<<endl;
}
return 0;
}

STL-set的API
