Official

A - 11/22 String Editorial by Nyaan


初心者の方へ
  • プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは practice contest の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
  • また、プログラミングコンテストの問題に慣れていない方は、 AtCoder Beginners Selection の問題をいくつか試すことをおすすめします。
  • C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。

この問題は文字列を上手く扱えるかを問うている問題です。
入力された長さ \(N\) の文字列 \(S\)\(11/22\) 文字列であるかを判定するには次の条件がすべて成り立つかを確認すればよいです。

  • \(N\) が奇数
  • \(1\) 文字目から \(\frac{N+1}{2}-1\) 文字目までが 1
  • \(\frac{N+1}{2}\) 文字目が /
  • \(\frac{N+1}{2} + 1\) 文字目から \(N\) 文字目までが 2

これらの条件が成り立つかを判定するには、文字列 \(S\) の何文字目が何であるかを 1 個 1 個調べて行けばよく、これを行うことで AC することができます。
なお、C++ では std::string 型を利用すれば文字列の操作を容易に行うことが出来るため、std::string 型を使用することをお勧めします。

  • 実装例 (C++) : 実装例では関数を用いた書き方をしています。関数を利用することで似た処理を複数回実装するのでなく 1 回の実装で済ませることが出来ます。
#include <iostream>
#include <string>
using namespace std;

void No() {
  cout << "No" << "\n";
  exit(0);
}

int main() {
  int N;
  string S;
  cin >> N >> S;
  if (N % 2 == 0) No();
  for (int i = 0; i < (N + 1) / 2 - 1; i++) {
    if (S[i] != '1') No();
  }
  if (S[(N + 1) / 2 - 1] != '/') No();
  for (int i = (N + 1) / 2; i < N; i++) {
    if (S[i] != '2') No();
  }
  cout << "Yes" << "\n";
}

posted:
last update: