文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

手芸王 [AtCoder Beginner Contest 023 B]

atcoder.jp


与えられた文字列が、指定の手順で作られたかどうか判定する問題です。


手順は、まず "b" を初期文字列として設定し、その後、


・両端に "a" と "c" を付ける
・両端に "c" と "a" を付ける
・両端に "b" と "b" を付ける
・以下、この繰り返し


となっています。


手順を検証する前に、例外を除外します。
上記の手順によって作られた文字列は、その長さが必ず奇数になるので、n が偶数なら -1 を出力します。また、中央の文字は必ず "b" であるはずなので、それ以外の文字だった場合は -1 を出力します。


void solve () {

	int n = nextInt();
	if (n%2 == 0) {
		out.println(-1);
		return;
	}

	String s = next();
	if (s.charAt(n/2) != 'b') {
		out.println(-1);
		return;
	}

	for (int i=0; i<n/2; i++) {
		if (i%3 == 0) {
			if (s.charAt(n/2-i-1)!='a' || s.charAt(n/2+i+1)!='c') {
				out.println(-1);
				return;
			}
		}
		else if (i%3 == 1) {
			if (s.charAt(n/2-i-1)!='c' || s.charAt(n/2+i+1)!='a') {
				out.println(-1);
				return;
			}
		}
		else if (i%3 == 2) {
			if (s.charAt(n/2-i-1)!='b' || s.charAt(n/2+i+1)!='b') {
				return;
			}
		}
	}

	out.println(n/2);

}


中央の文字列から外側へ向かって、手順通りになっているかどうか n/2 回検証します。


・s.charAt(n/2-i-1), s.charAt(n/2+i+1)


この2つが「内側から i 番目にある文字列」を指しますが、添え字を考えるのが難しかったです。