問題:ABC 053 B - A to Z String
問題文
すぬけくんは文字列 $s$ の連続した一部分(部分文字列という)を取り出して先頭が A であり末尾が Z であるような文字列を作ることにしました。 すぬけくんが作ることのできる文字列の最大の長さを求めてください。なお,$s$ には先頭が A であり末尾が Z であるような部分文字列が必ず存在することが保証されます。
制約
・$1 \le |s| \le 200,000$
・$s$ は英大文字のみからなる
・$s$ には先頭が A であり末尾が Z であるような部分文字列が必ず存在する
収録されている問題セット
回答1 (AC)
文字列 s を読み込んだ後、最初の文字から順番に 'A' を探し、最後の文字から順番に 'Z' を探すことで、先頭が A であり末尾が Z であるような部分文字列を探しました。コードは以下のようになりました。
abc053b-1.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int left = 0, right = s.size()-1;
while ( s.at(left)!='A' ) {
left += 1;
}
while ( s.at(right)!='Z' ) {
right -= 1;
}
cout << right-left+1 << endl;
}
回答2 (AC)
C++ の文字列に関する関数を調べたところ、回答1で用いたような関数が用意されていることを知りました。文字列 s に対し、s.find('A') で最初の 'A' の位置を、s.rfind('Z') で最後の 'Z' の位置を求めることができます。コードは以下のようになりました。
abc053b-2.cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
cout << s.rfind('Z')-s.find('A')+1 << endl;
}
調べたこと
AtCoder の解説 → コンテスト全体の解説
回答1,2と同じ方針でした。
リンク
- 前の記事 → AtCoderログ:0030 - ARC 123 A