AtCoder Beginner Contest 236 C - Route Map
問題の要約
鉄道のとある路線にはN個の駅が存在し、始点から終点に向かってi(1<=i<=N)番目の駅の名前はSi。
普通列車は全ての駅に止まるが、急行列車は全ての駅に止まるとは限らない。
急行列車はM(M<=N)個の駅にのみ止まり、j(1<=j<=M)番目に止まる駅の名前はTj。
ただし、急行列車は始点と終点の両方に止まることが保証される。
N個の駅それぞれについて、その駅に急行列車が止まるかどうか判定せよ。
制約
2<=M<=N<=10^5
Si(1<=i<=N)は英小文字のみからなる1文字以上10文字以下の文字列
Si≠Sj(i≠j)
入力
N M
S1 ... SN
T1 ... TM
考え方
1,駅名から何番目の駅かを高速に探し出せればよい。vector<bool>で止まるかどうか管理して、答えを出力する。
2,map<string,long long>に駅名と何番目かを入れておく。
3,vector<bool>をfalseで初期化して、急行列車が止まるところのみmapのfindで何番目の駅かを探し、trueにする。
4,その後vector<bool>をみて答えを出力する。
実際のプログラム
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
int main(){
long long N,M;
cin >> N >> M;
map<string,long long> mp;
for(long long i = 0; i < N; i++){
string S;
cin >> S;
mp.insert(make_pair(S,i));
}
vector<bool> ans(N,false);
for(long long i = 0; i < M; i++){
string T;
cin >> T;
ans[mp.find(T)->second] = true;
}
for(long long i = 0; i < N; i++){
if(ans[i]){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
}
return 0;
}