pre{ white-space: pre; } .entry-content pre{ word-wrap: normal; }

CODE FESTIVAL 2017 Final

問題のURL
https://cf17-final-open.contest.atcoder.jp/assignments

A問題
文字列 S が与えられます。
高橋君はこの文字列の好きな位置に好きなだけ文字 A を挿入することができます。
S を AKIHABARA に変えることはできるでしょうか?

五重ループでゴリ押しして解きました。バグが消えなくて焦った汗
一番簡単な解法は正規表現で書く方法だと思います。

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		String x = "^A?KIHA?BA?RA?$";
		System.out.println(s.matches(x) ? "YES" : "NO");
	}
}

B問題
すぬけ君は a、b、c の 3 種類の文字のみからなる文字列 S を持っています。
回文恐怖症のすぬけ君は S の文字を自由に並び替えて、2 文字以上の回文を部分文字列として含まないようにしようと思いました。 これが可能かどうかを判定して下さい。

最後のケースがWAになり最後まで解ききることができなかった。まじで悔しい!
aaabbbcccccはacacacbcbcbになるから回分だと勘違いをしていました。普通にこの部分文字列は気分含んでるんですけどね...泣
コンテスト終了後に解きました。

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		int n = s.length();
		int[] a = new int[3];
		for(int i = 0 ; i < n ; i++) {
			if(s.charAt(i) == 'a') {
				a[0]++;
			} else if(s.charAt(i) == 'b') {
				a[1]++;
			} else if(s.charAt(i) == 'c') {
				a[2]++;
			}
 		}
		boolean ok = true;
		if(a[0] >= 1 && a[1] >= 1 && a[2] >= 1) {
			// 3種類
			if(Math.abs(a[0] - a[1]) >= 2 || Math.abs(a[0] - a[2]) >= 2 || Math.abs(a[1] - a[2]) >= 2) {
				ok = false;
			}
		} else if((a[0] == 0 && a[1] >= 1 && a[2] >= 1) || (a[0] >= 1 && a[1] == 0 && a[2] >= 1) || (a[0] >= 1 && a[1] >= 1 && a[2] == 0)) {
			// 2種類
			if(!(n == 2 && s.charAt(0) != s.charAt(1))) {
				ok = false;
			}
		} else if((a[0] == 0 && a[1] >= 0 && a[2] >= 1) || (a[0] >= 0 && a[1] == 1 && a[2] >= 0) || (a[0] >= 1 && a[1] >= 0 && a[2] == 0)) {
			// 1種類
			if(n != 1) {
				ok = false;
			}
		}
			if(ok == true) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}
	}
}

でも最近コンテストで300点問題解けるようなってきたので成長してきたと信じたい。
ABC_Cがあと6問で全部解き終わるけど難しいやつしか残ってないからきつい。けど頑張って埋めるか。