この問題は、for
文でも解けるし、map
でも解ける。ここでは map
で解いてみよう。
問題概要
個の文字列 と、 個の文字列 が与えられる。
これに対して文字列を考えて、その文字列に対するスコアは
( に含まれている分の個数) - ( に含まれている分の個数)
で決まる。スコアの最大値を求めよ。
制約
考えたこと
基本的には次のような配列を作りたい。
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; }