読者です 読者をやめる 読者になる 読者になる

はまやんはまやんはまやん

hamayanhamayan's blog

s-palindrome [Codeforces 教育 14 : B]

問題

http://codeforces.com/contest/691/problem/B

文字列sが与えられる。
この文字列の中心(奇数個であれば、その文字のちょうど真ん中)でちょうど左右が鏡写しになっているとき"TAK"と出力する。
そうでないなら"NIE"と出力。

1 <= |s| <= 10^3

考察

1. 微妙にクソ問な感じがする
2. まず鏡写しの文字を考えると、以下のとおり

A | A
b | d
H | H
I | I
i | i
l | l
M | M
O | O
o | o
p | q
T | T
U | U
V | V
v | v
W | W
w | w
X | X
x | x
Y | Y

3. 文字列が奇数個であれば、その文字自体が鏡写しのものが中心にくる必要がある。それは以下のとおり

A H I i l M O o T U V v W w X x Y

4. これをチェックするだけ

実装

http://codeforces.com/contest/691/submission/19101050

string s;
//-----------------------------------------------------------------
string rev_pair[2] = {
	"AbdHIMOopqTUVvWwXxY",
	"AdbHIMOoqpTUVvWwXxY"
};
string rev_self = "AHIMOoTUuVvWwXxY";
string solve() {
	int n = s.length();

	if (n % 2 == 1) {
		if (rev_self.find(s[n / 2]) == string::npos) return "NIE";
	}

	rep(i, 0, n / 2) {
		int j = rev_pair[0].find(s[i]);
		if (j == string::npos) return "NIE";

		if (s[n - 1 - i] != rev_pair[1][j]) return "NIE";
	}

	return "TAK";
}
//-----------------------------------------------------------------
int main() {
	cin >> s;
	cout << solve() << endl;
}