yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

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;
}