【AtCoder】ABC 441 B - Two Languages
AtCoder/ABC/B問題AtCoder/ABC/200点問題AtCoder/灰DiffAtCoder/NoviSteps/6QAtCoder/アルゴリズムの基礎/条件分岐AtCoder/データ構造/map競技プログラミング

B - Two Languages
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
AtCoder
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 70 / NoviSteps: 6Q / 配点: 200 点
問題概要
AtCoder 国の公用語は、高橋語と青木語の つの言語である。 高橋語では長さ の文字列 に含まれる英小文字のみを使い、青木語では長さ の文字列 に含まれる英小文字のみを使う。
AtCoder 国の公用語に含まれる 個の単語 が与えられるので、それぞれの単語について次のうちどれに該当するか判定せよ。
- 高橋語の単語であることが確定する
- 青木語の単語であることが確定する
- どちらともいえない
制約
- は英小文字からなる長さ の文字列
- に含まれる文字は先頭からアルファベット順で昇順に並んでいる
- に含まれる文字はすべて異なる
- に含まれる文字はすべて異なる
- は英小文字からなる長さ 以上 以下の文字列
- は高橋語か青木語のどちらかの単語
- は整数
考察
まず、 に含まれる各アルファベットごとに、以下のように分類しておく。
- 高橋語にのみ含まれる
- 青木語にのみ含まれる
- 両方に含まれる or 両方に含まれない
その後、個の各単語について、それに含まれる各アルファベットを調べ、以下のように判定する。
- 高橋語にのみ含まれるアルファベットが1つでもあれば「高橋語」と確定
- 青木語にのみ含まれるアルファベットが1つでもあれば「青木語」と確定
- どちらにも該当しなければ判断を保留し、最終的に保留の場合は「どちらともいえない」と判定する。
前半の分類は、mapを用いて実装すると良さそう。
詳しくは実装例を参照。
実装例
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. string S, T;13. cin >> S >> T;14. 15. map<char, int> mp;16. rep(i, 0, N)17. {18. mp[S[i]] = 1;19. }20. rep(i, 0, M)21. {22. if (mp[T[i]] == 1)23. mp[T[i]] = 0;24. else25. mp[T[i]] = -1;26. }27. 28. int Q;29. cin >> Q;30. 31. while (Q--)32. {33. string w;34. cin >> w;35. 36. bool flag = false;37. for (auto &&c : w)38. {39. if (mp[c] == 1)40. {41. cout << "Takahashi" << endl;42. flag = true;43. break;44. }45. else if (mp[c] == -1)46. {47. cout << "Aoki" << endl;48. flag = true;49. break;50. }51. }52. 53. if (!flag)54. cout << "Unknown" << endl;55. }56. 57. return 0;58.}https://atcoder.jp/contests/abc441/submissions/72512524
atcoder.jp
実装時間: 5 分
コメント
B問題にしては実装重ための問題だった気がする。





