题解:P7008 [CERC2013] What does the fox say?
luobotianle · · 题解
题意其实很简单:在给出的 getline 和 stringstream 的话,输入会变得很简单,但蒟蒻不会,所以这里用了 getchar 边读入字符边存储字符串。
由于 getchar “什么都吃”的特性,导致这样写要注意很多细节,在代码中将一一展示。
#include<bits/stdc++.h>
using namespace std;
vector<string> a;//用来记录出现过的叫声
map<string,bool> mp;//用来记录是否是狐狸的叫声
string s,s1,s2;
int main(){
int T;
cin>>T;
char ch=getchar();//将 T 后面的换行 ('\n') 吃掉
while(T--){
mp.clear();//多测清空
a.clear();
s=s1=s2="";
while(1){
ch=getchar();
if(ch=='\n'){//第一段输入是一行,所以遇到换行就说明结束了
a.push_back(s); //最后一个词也要加入
mp[s]=1;//该叫声出现过,可能是狐狸的叫声
break;
}
else if(ch==' '){//遇到空格,将此时的 s 加入
a.push_back(s);
mp[s]=1;
s="";//将用于记录的 s 清空
}
else s+=ch;//更新 s
}
while(cin>>s>>s1>>s2,s1=="goes")mp[s2]=0;//该声音不是狐狸叫声
do{ch=getchar();}while(ch!='\n');//这里要用do_while,因为此时的 ch 还是换行符 '\n'
for(auto &i:a){
if(mp[i])cout<<i<<" ";//循环每一个出现过的叫声,将狐狸的叫声输出
}
cout<<"\n";
}
return 0;
}