【AtCoder】ABC 480 B - Invalid Vote

atcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 201 / NoviSteps: 5Q / 配点: 200 点

問題概要

選挙に NN 人の候補者が立候補している。 各候補者の名前は英小文字からなり、互いに異なる。 候補者 ii の名前は SiS_i である。

MM 枚の投票用紙が投じられ、投票用紙 jj には英小文字からなる文字列 TjT_j が書かれていた。

TjT_j が名前に完全に一致している候補者がいる場合、その候補者に 11 票が入る。 そうでなく、TjT_j を 11 文字書き換えて名前が一致するような候補者がちょうど 11 人いる場合、その候補者に 11 票が入る。 そうでない場合、それは無効票となる。

i=1,2,…,Ni=1,2,\dots,N について、候補者 ii に何票入るかを求めよ。

制約

  • 1≤N,M≤1001 \leq N, M \leq 100
  • 1≤∣Si∣≤101 \leq |S_i| \leq 10
  • 1≤∣Tj∣≤101 \leq |T_j| \leq 10
  • NN と MM は整数

考察

基本的には言われたことをやるだけ。

以下の処理を正確に実装していこう。


  1. 各 i=1,2,…,Ni = 1, 2, \dots, N について、TiT_i に注目する。
  2. ii を固定したときの各 j=1,2,…,Nj = 1, 2, \dots, N について、SjS_j と TiT_i を比較する。
    1. Sj=TiS_j = T_i ならば、候補者 jj に 11 票を入れて、次の TiT_i に進む。
    2. そうでない場合、もし ∣Sj∣≠∣Ti∣|S_j| \neq |T_i| ならば、次の SjS_j に進む。
    3. そうでない場合、SjS_j と TiT_i の文字列を比較して、異なる文字の個数を数える。
      1. 異なる文字の個数が 11 ならば、候補者 jj を 11 票の候補者として記録する。
      2. 11 票の候補者が複数いる場合は、無効票として次の TiT_i に進む。
      3. 11 票の候補者がちょうど 11 人いる場合は、その候補者に 11 票を入れて、次の TiT_i に進む。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)
5.
6.// ======================================== //
7.
8.int main()
9.{
10. int N, M;
11. cin >> N >> M;
12. vector<string> S(N);
13. rep(i, 0, N) cin >> S[i];
14.
15. vector<int> cnt(N, 0);
16. rep(i, 0, M) {
17. string T;
18. cin >> T;
19.
20. int cand = 0, near = 0, exact = -1;
21. rep(j, 0, N) {
22. if (S[j] == T) {
23. exact = j;
24. break;
25. }
26.
27. if (S[j].size() != T.size()) continue;
28.
29. int mismatch = 0;
30. rep(k, 0, S[j].size()) {
31. if (S[j][k] != T[k]) {
32. mismatch++;
33. if (mismatch >= 2) break;
34. }
35. }
36.
37. if (mismatch == 1) {
38. cand++;
39. near = j;
40. }
41. }
42.
43. if (exact != -1) cnt[exact]++;
44. else if (cand == 1) cnt[near]++;
45. }
46.
47. rep(i, 0, N) cout << cnt[i] << endl;
48.
49. return 0;
50.}
atcoder.jp favicon

実装時間: 10分

コメント

200点B問題にしては実装が重め。

こういうときは変数名をさぼらずに、確実に書いていきたい。