AtCoder が提供しているABC(AtCoder Beginner Contest)310 のC問題をC++とPythonで解いてみました。ABC310は、2023年7月15日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Reversible(Difficulty : 272)
問題はリンク先をご覧ください。
ひと工夫して単語の種類をカウントする問題です。AtCoder Problems による Difficulty は 272 でした。
解答案
前後反転した文字列を同一とみるため、与えられた文字列と前後反転した文字列の辞書順に小さい文字列を set コンテナに登録します。
C++ プログラム例(ABC310C)
元の文字列 s[i] と reverse した文字列 t を比較して小さい文字列を set コンテナ result に格納します(15ー17行目)。最後に result の size を出力します(20行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> s(n);
for (int i = 0; i < n; ++i) {
cin >> s[i];
}
set<string> result;
for (int i = 0; i < n; ++i) {
string t = s[i];
reverse(t.begin(), t.end());
result.insert(min(s[i], t));
}
cout << result.size() << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC310C)
Python では、文字列の文字を置き換えることができません。組込み関数 reversed はイテレータを返します。その結果を list 化して join するのは、定番表現です(7行目)。
"""AtCoder Beginner Contest 310 C"""
n = int(input())
s = [input() for i in range(n)]
result = set()
for i in range(n):
result.add(min(s[i], ''.join(list(reversed(s[i])))))
print(len(result))
スライス記法を使うともっと簡潔に書けます(7行目)。こちらの方が、Python らしい書き方かもしれません。
"""AtCoder Beginner Contest 310 C"""
n = int(input())
s = [input() for i in range(n)]
result = set()
for i in range(n):
result.add(min(s[i], s[i][::-1]))
print(len(result))
どちらも「AC」と判定されました。
最後に
前後反転したものを同一視するという条件があります。文字列とその反転の文字列を辞書順で比較して小さい方をカウントして対応しました。問題を解きやすい形に変形することができ、簡潔なプログラムとなりました。
引き続き ABC の問題を紹介していきます。