AOJ0571 JJOOII
問題リンク JJOOII
- 解法
Oがk個連続している部分の左側にk個以上連続しているJ、右側にk個以上連続しているIがあればレベルkのJOIが存在することになります。また、この場所ではレベルk以外のJOIを作ることはできません。同じ文字が連続している部分を圧縮すれば上のチェックがO(1)でできるので解けます。
- ソース
import java.util.ArrayList; import java.util.List; import java.util.Scanner; //JJOOII public class AOJ0571 { class R{ char ch; int c; public R(char ch, int c) { this.ch = ch; this.c = c; } } void run(){ Scanner sc = new Scanner(System.in); char[] s = sc.next().toCharArray(); int n = s.length, c = 1; char r = s[0]; List<R> l = new ArrayList<R>(); for(int i=1;i<n;i++){ if(s[i]!=r){ l.add(new R(r, c)); r = s[i]; c = 0; } c++; } l.add(new R(r, c)); int res = 0; for(int i=1;i<l.size()-1;i++){ R r1 = l.get(i-1), r2 = l.get(i), r3 = l.get(i+1); if(r1.ch=='J'&&r2.ch=='O'&&r3.ch=='I'&&r2.c<=r1.c&&r2.c<=r3.c)res = Math.max(res, r2.c); } System.out.println(res); } public static void main(String[] args) { new AOJ0571().run(); } }