寝癖頭の解法

小学生の目線から、勉強中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #Volume6 - 0654 : Circle Cross Stamps

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題: 『マルバツスタンプ (Circle Cross Stamps)』

onlinejudge.u-aizu.ac.jp
JOI 君はマルスタンプ,バツスタンプ,マルバツスタンプの3種類のスタンプをそれぞれ 0 個以上持っている.これらはマルやバツのマークを紙に印字することができるスタンプである.

マルスタンプを使うとマルが 1 つ印字され,バツスタンプを使うとバツが 1 つ印字される.マルバツスタンプを使うとマルとバツが横一列に 1 つずつ印字され,スタンプの向きを変えることで,マルの右にバツが来るようにも,バツの右にマルが来るようにも印字できる.

JOI 君は,持っているスタンプをそれぞれちょうど 1 回ずつ適当な順番で使い,紙に横一列にマルとバツを印字した.印字されたマルとバツの列は文字列 S で表される.S は O と X から構成された長さ N の文字列であり,Si= O ならば JOI 君が印字したマークのうち左から i 番目のものがマルであることを表し,Si= X ならばそれがバツであることを表す (1≦i≦N).

あなたは,JOI 君が持っているスタンプの個数は分からないが,JOI 君が印字したマルとバツの列は知っている.印字されたマルとバツの列から,JOI 君が持っているマルバツスタンプの個数としてあり得るもののうち最大値を求めよ.

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #Volume6 - 0654 : Circle Cross Stamps
/*
Aizu Online Judge in C++ #Volume6 - 0654 : Circle Cross Stamps
https://onlinejudge.u-aizu.ac.jp/problems/0654
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  int n;
  string s;
  cin>>n>>s;
  int cnt=0;
  for(int i=0;i<n-1;){
    string t=s.substr(i,2);
    if(t=="OX" || t=="XO"){
      cnt++;
      i+=2;
    }else{
      i+=1;
    }
  }
  cout<<cnt<<endl;
  return 0;
}

設問の出典は、『第 18 回日本情報オリンピック JOI 2018/2019 予選競技課題』です。
問題は、AtCoder Problemsでも公開されています。
atcoder.jp