AtCoder が提供しているABC(AtCoder Beginner Contest)322 のB問題をC++とPythonで解いてみました。ABC322は、2023年9月30日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Prefix and Suffix(Difficulty : 54)
問題はリンク先をご覧ください。
文字列から部分文字列を切り取る方法が学べます。AtCoder Problems による Difficulty は 54 でした。
解答案
C++ プログラム例(ABC322B)
C++では、substr メソッドで部分文字列を切り出すことができます。第1引数は開始位置、第2引数は長さになります。
- 文字列の先頭n文字を切り取るには、substr(0, n) となります。
- 長さmの文字列の後ろn文字を切り取るには、substr(m – n, n) となります。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
string s, t;
cin >> s >> t;
if ((s == t.substr(0, n))&&(s == t.substr(m - n, n))) {
cout << 0 << endl;
} else if (s == t.substr(0, n)) {
cout << 1 << endl;
} else if (s == t.substr(m - n, n)) {
cout << 2 << endl;
} else {
cout << 3 << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC322B)
Python では、スライス記法で文字列が切り取れます。スライス記法では、開始位置と終了位置を半開区間 [開始位置, 終了位置) として指定します。
- 文字列の先頭n文字を切り取るには、[0:n] となります。
- 長さmの文字列の後ろn文字を切り取るには、[m – n:m] となります。
"""AtCoder Beginner Contest 322 B"""
n, m = map(int, input().split())
s = input()
t = input()
if s == t[0:n] and s == t[m - n:m]:
result = 0
elif s == t[0:n]:
result = 1
elif s == t[m - n:m]:
result = 2
else:
result = 3
print(result)
こちらも「AC」と判定されました。
最後に
C++のsubstrと、Pythonのスライス記法は、指定の仕方が異なります。個人的には、半開区間を指定するスライス記法の方が分かりやすいと感じます。
引き続き ABC の問題を紹介していきます。