【AtCoder】ABC 480 B - Invalid Vote
AtCoder/ABC/B問題AtCoder/ABC/200点問題AtCoder/灰DiffAtCoder/NoviSteps/5QAtCoder/アルゴリズムの基礎/条件分岐AtCoder/アルゴリズムの基礎/forループAtCoder/文字列探索競技プログラミング
https://atcoder.jp/contests/abc480/tasks/abc480_b
atcoder.jp
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 201 / NoviSteps: 5Q / 配点: 200 点
問題概要
選挙に 人の候補者が立候補している。 各候補者の名前は英小文字からなり、互いに異なる。 候補者 の名前は である。
枚の投票用紙が投じられ、投票用紙 には英小文字からなる文字列 が書かれていた。
が名前に完全に一致している候補者がいる場合、その候補者に 票が入る。 そうでなく、 を 文字書き換えて名前が一致するような候補者がちょうど 人いる場合、その候補者に 票が入る。 そうでない場合、それは無効票となる。
について、候補者 に何票入るかを求めよ。
制約
- と は整数
考察
基本的には言われたことをやるだけ。
以下の処理を正確に実装していこう。
- 各 について、 に注目する。
- を固定したときの各 について、 と を比較する。
- ならば、候補者 に 票を入れて、次の に進む。
- そうでない場合、もし ならば、次の に進む。
- そうでない場合、 と の文字列を比較して、異なる文字の個数を数える。
- 異なる文字の個数が ならば、候補者 を 票の候補者として記録する。
- 票の候補者が複数いる場合は、無効票として次の に進む。
- 票の候補者がちょうど 人いる場合は、その候補者に 票を入れて、次の に進む。
実装例
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.}https://atcoder.jp/contests/abc480/submissions/80169836
atcoder.jp
実装時間: 10分
コメント
200点B問題にしては実装が重め。
こういうときは変数名をさぼらずに、確実に書いていきたい。





