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

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

AtCoder Beginner Contest 243 B - Hit and Blow

問題の要約
 長さNの整数列A=(A1,A2,...,AN),B=(B1,B2,...,BN)が与えられる。
 次の2つを出力せよ。
 1.AにもBにも含まれ、その位置も一致している整数の個数。
 2.AにもBにも含まれるが、その位置は異なる整数の個数。
制約
 1<=N<=1000
 1<=Ai,Bi<=10^9
 Aiはすべて異なる
 Biはすべて異なる。
入力
 N
 A1 A2 ... AN
 B1 B2 ... BN
考え方
 1,値に対して位置を返してくれるデータ構造を使う。今回はmapを使う。
 2,整数列Aの数Aiをキーをして位置i+1を値として使ってmapを作る。
 3,条件1の答えをans1、条件2の答えをans2として用意する。
 4,整数列BのBiをキーにして、作ったmapに検索をかけ、条件に合った方の答えを増やしていく。
実際のプログラム
#include<iostream>
#include<map>

using namespace std;

int main(){
  int N;
  cin >> N;
  map<long long,int> mp;
  for(int i = 0; i < N; i++){
    long long Ai;
    cin >> Ai;
    mp[Ai] = i+1;
  }
  
  
  int ans1 = 0;
  int ans2 = 0;
  for(int i = 0; i < N; i++){
    long long Bi;
    cin >> Bi;
    if(mp[Bi] != 0){
      if(mp[Bi] == i+1){
        ans1++;
      }else{
        ans2++;
      }
    }
  }
  
  cout << ans1 << endl;
  cout << ans2 << endl;
  
  return 0;
}