結果

問題 No.2490 Escalator
ユーザー Sillpherth
提出日時 2025-04-21 20:48:21
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
MLE  
実行時間 -
コード長 1,614 bytes
コンパイル時間 1,136 ms
コンパイル使用メモリ 91,372 KB
実行使用メモリ 813,948 KB
最終ジャッジ日時 2025-04-21 20:48:28
合計ジャッジ時間 7,287 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 31 MLE * 1 -- * 41
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
using namespace std;

// 回文判定関数
bool check(const vector<int>& S, int N) {
    int size = S.size();
    
    // DPテーブルの初期化
    vector<vector<bool>> dp(size, vector<bool>(size, false));

    // 長さ1の回文(任意の位置で回文は成立)
    for (int i = 0; i < size; ++i) {
        dp[i][i] = true;
    }

    // 長さ2の回文チェック
    for (int i = 0; i < size - 1; ++i) {
        dp[i][i + 1] = (S[i] == S[i + 1] || S[i] == -1 || S[i + 1] == -1);
    }

    // 長さ3以上の回文チェック
    for (int len = 3; len <= size; ++len) {
        for (int i = 0; i <= size - len; ++i) {
            int j = i + len - 1;
            // 両端が一致し、内側が回文であれば回文
            dp[i][j] = (S[i] == S[j] || S[i] == -1 || S[j] == -1) && dp[i + 1][j - 1];
        }
    }

    // 回文の長さがNを超えるかどうかチェック
    for (int i = 0; i < size; ++i) {
        for (int j = i + N; j < size; ++j) {
            if (dp[i][j]) {
                return true;
            }
        }
    }

    return false;
}

int main() {
    ios::sync_with_stdio(false);  // cin/cout の高速化
    cin.tie(0);                   // cin のタイミング調整

    int N;
    cin >> N;
    vector<int> A(2 * N);
    for (int i = 0; i < 2 * N; ++i) {
        cin >> A[i];
    }

    // AA = A + A(連結)
    vector<int> AA(4 * N);
    for (int i = 0; i < 2 * N; ++i) {
        AA[i] = A[i];
        AA[i + 2 * N] = A[i];
    }

    cout << (check(AA, N) ? "Yes" : "No") << '\n';
    return 0;
}
0