寝癖頭の解法

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

Aizu Online Judge in C++ #Volume5 - 0522 : JOI and IOI

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

・問題 『JOI and IOI』
https://onlinejudge.u-aizu.ac.jp/problems/0522
与えられた文字列内の連続する3文字が,JOIまたはIOIという並びになっている個所がそれぞれ何個所あるのかを数え上げるプログラムを作成せよ.

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

Aizu Online Judge in C++ #Volume5 - 0522 : JOI and IOI
/*
Aizu Online Judge in C++ #Volume5 - 0522 : JOI and IOI
https://onlinejudge.u-aizu.ac.jp/problems/0522
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    string s;
    while(cin>>s){
        int joi=0,ioi=0;
        for(int i=0;i<s.size()-2;i++){
            string t=s.substr(i,3);
            if(t=="JOI"){
                joi++;
            }else if(t=="IOI"){
                ioi++;
            }
        }
        cout<<joi<<endl;
        cout<<ioi<<endl;
    }
    return 0;
}

設問の出典は、第7回日本情報オリンピック 予選(過去問)です。
問題は、AtCoder Problemsでも公開されています。
atcoder.jp

で、よく見たら、同じ問題なのだけれど、「入力」に違いがあって...
AOJ: 入力は複数のデータセットからなる.各データセットは1行であり,10000文字以下のアルファベットの大文字からなる.入力は EOF で終了する.
AtCoder Problems: 入力は 1 行であり,10000 文字以下のアルファベットの大文字からなる.
だから、コードも変わります。

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

/*
AtCoder Problems in C++
#B - JOIとIOI
https://atcoder.jp/contests/joi2008yo/tasks/joi2008yo_b
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
  string s;
  cin>>s;
  int joi=0,ioi=0;
  for(int i=0;i<s.size()-2;++i){
    string t=s.substr(i,3);
    if(t=="JOI"){
      ++joi;
    }else if(t=="IOI"){
      ++ioi;
    }
  }
  cout<<joi<<endl;
  cout<<ioi<<endl;
  return 0;
}

はい、これでどっちもACです。