AOJ 0571 - JJOOII

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0571

解法

連続した J, O, I をそれぞれカウントし、O の個数が J, I の個数以下のときに O の個数がレベルに相当するので、これの最大値をとればよい。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7   static char s[1000001];
 8   scanf("%s", s);
 9   int ans = 0;
10   for (const char *p = s; *p != 0;) {
11     static const char joi[] = "JOI";
12     int cs[3];
13     for (int i = 0; i < 3; i++) {
14       cs[i] = 0;
15       while (*p != 0 && *p == joi[i]) {
16         ++cs[i];
17         ++p;
18       }
19     }
20     if (cs[0] >= cs[1] && cs[2] >= cs[1]) {
21       ans = max(ans, cs[1]);
22     }
23   }
24   printf("%d\n", ans);
25   return 0;
26 }
aoj/0571.cc