题解:P7008 [CERC2013] What does the fox say?

· · 题解

题意其实很简单:在给出的 n 个字符串中排除一些字符串,输出剩下的字符串;但由于这题没有给出 n,所以读入是一个问题。如果你会用 getlinestringstream 的话,输入会变得很简单,但蒟蒻不会,所以这里用了 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;
}