0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AtCoderログ:0031 - ABC 053 B

Posted at

問題: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と同じ方針でした。

リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?