CCF-201403-3
通过这个题目我认识一下sstream和getline()让我们看看题目怎么说解题思路代码是这样的STL-set的API
通过这个题目我认识一下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