Problem:
JOIとIOI

問題

与えられた文字列内の連続する3文字が，JOIまたはIOIという並びになっている個所がそれぞれ何個所あるのかを数え上げるプログラムを作成せよ．文字列はアルファベットの大文字だけからなる．例えば下図の「JOIOIOI」という文字列にはJOIが1個所，IOIが2個所に含まれている．

入力

入力は複数のデータセットからなる．各データセットは1行であり，10000文字以下のアルファベットの大文字からなる．入力は EOF で終了する.

データセットの数は 5 を超えない．

出力

データセットごとに, 1行目に見つかったJOIの個数，2行目に見つかったIOIの個数をそれぞれ出力せよ．

入出力例

入力例

JOIJOI
JOIOIOIOI
JOIOIJOINXNXJIOIOIOJ

出力例

2
0
1
3
2
3

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;


class Template
{
	static Scanner sc;

	public static void Main(string[] args)
	{
		sc = new Scanner();
		while (true)
		{
			string s = sc.next();
			if (s == null) break;
			int jcnt = 0, icnt = 0;
			bool jflag = false, iflag = false, joflag = false, ioflag = false;
			for (int i = 0; i < s.Length; i++)
			{
				if (s[i] == 'J')
				{
					jflag = true;
					if (joflag) joflag = false;
					if (iflag) iflag = false;
					if (ioflag) ioflag = false;
				}
				if (s[i] == 'I')
				{
					iflag = true;
					if (jflag) jflag = false;
					if (ioflag)
					{
						icnt++; ioflag = false;
					}
					if (joflag)
					{
						jcnt++; joflag = false;
					}

				}
				if (s[i] == 'O')
				{
					if (ioflag)
					{
						ioflag = false; continue;
					}
					if (joflag)
					{
						joflag = false; continue;
					}
					if (jflag)
					{
						joflag = true; jflag = false;
					}
					if (iflag)
					{
						ioflag = true; iflag = false;
					}
				}
			}
			Console.WriteLine(jcnt);
			Console.WriteLine(icnt);
		}
	}
}

public class Scanner
{
	public Scanner() { }
	public string next()
	{
		return Console.ReadLine();
	}
	public int nextInt()
	{
		return int.Parse(next());
	}
	public double nextDouble()
	{
		return double.Parse(next());
	}
	public long nextLong()
	{
		return long.Parse(next());
	}
	public string[] nextArray()
	{
		return next().Split(' ');
	}
	public int[] nextIntArray()
	{
		return Array.ConvertAll(nextArray(), e => int.Parse(e));
	}
	public long[] nextLongArray()
	{
		return Array.ConvertAll(nextArray(), e => long.Parse(e));
	}
	public double[] nextDoubleArray()
	{
		return Array.ConvertAll(nextArray(), e => double.Parse(e));
	}
}