けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 091 B - Two Colors Card Game (6Q, 灰色, 200 点)

この問題は、for 文でも解けるし、map でも解ける。ここでは map で解いてみよう。

問題概要

 N 個の文字列  S_{1}, S_{2}, \dots, S_{N} と、 M 個の文字列  T_{1}, T_{2}, \dots, T_{M} が与えられる。

これに対して文字列を考えて、その文字列に対するスコアは

( S_{1}, S_{2}, \dots, S_{N} に含まれている分の個数) - ( T_{1}, T_{2}, \dots, T_{M} に含まれている分の個数)

で決まる。スコアの最大値を求めよ。

制約

  •  1 \le N, M \le 100

考えたこと

基本的には次のような配列を作りたい。


  • score[str]:文字列 str のスコア

しかし、普通の配列は、添字に文字列を指定することはできない。そこで、連想配列を使おう。C++ では、map<(配列の添字の型, 配列の値の型)> 型が使える。今回は map<string, int> 型が使える。

なお、この型を使うとき、新たな添字を用いて配列にアクセスすると、その添字に対する値は 0 に初期化される。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, M;
    string str;
    map<string, int> score;

    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> str;
        score[str]++;
    }
    cin >> M;
    for (int i = 0; i < M; i++) {
        cin >> str;
        score[str]--;
    }

    int res = 0;
    for (auto [str, num] : score) res = max(res, num);
    cout << res << endl;
}