intさわだんのBlack History

刹那的レジェンドになりたい。

第8回日本情報オリンピック 本選 「IOIOI」

m<=1000000から察するに、オーダーはO(M).

解法の詳細は、連続する"IOI"の数を計算する。(たとえば、IOIOIのとき2)
その値をtとすると、ans += max(0,t-n+1)で答えが求まる。
少し考えればできる問題。

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

int main(){

	while(1){
	int n,m;
	char s[1000005];
	scanf("%d",&n);
	if(n == 0)break;
	scanf("%d",&m);
	scanf("%s",&s);

	int ren = 0;
	int ans = 0;

	for(int i = 0;i < m - 2;i++){
		if(s[i] == 'I' && s[i+1] == 'O' && s[i+2] == 'I'){
			ren++;
			i++;
		}else{
			if(ren != 0)ans += max(0,ren - n + 1);
			ren = 0;
		}
	}
		if(ren != 0)ans += max(0,ren - n + 1);
	printf("%d\n",ans);
	}
	return 0;

}