けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 307 B - racecar (6Q, 灰色, 200 点)

ザ・6Q という感じの問題!

問題概要

 N 個の文字列  S_{1}, S_{2}, \dots, S_{N} が与えられる。

これらの文字列から 2 個選んで連結して得られる文字列が回文になることがあり得るかどうかを判定せよ。

解法

この問題は 2 つのパートで成り立っている。

  •  N 個の文字列から  2 つ選んで連結する
  • 得られた文字列が回文であるかどうかを判定する

前半は二重 for 文で実装できる。後者については、あらかじめ「回文判定関数」を作っておくと実装しやすい。

コード

#include <bits/stdc++.h>
using namespace std;

bool iskai(const string &S) {
    bool res = true;
    for (int i = 0, j = S.size()-1; i <= j; ++i, --j) {
        if (S[i] != S[j]) return false;
    }
    return true;
}

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    for (int i = 0; i < N; ++i) cin >> S[i];
    
    bool res = false;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if (i == j) continue;
            if (iskai(S[i] + S[j])) res = true;
        }
    }
    cout << (res ? "Yes" : "No") << endl;
    
}