結果

問題 No.2490 Escalator
ユーザー Sillpherth
提出日時 2025-04-21 20:42:19
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,909 bytes
コンパイル時間 877 ms
コンパイル使用メモリ 86,180 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-04-21 20:42:23
合計ジャッジ時間 3,489 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 2
other AC * 54 WA * 19
権限があれば一括ダウンロードができます

ソースコード

diff #

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

// Manacher法で回文の長さを求める関数
vector<int> manacher(const vector<int>& S, int N) {
    int size = 2 * N;  // 元の配列のサイズ
    vector<int> P(size, 0);  // P[i]はS[i]を中心に広がる回文の半径
    int C = 0, R = 0;  // C: 中心、R: 右端

    for (int i = 0; i < size; ++i) {
        int mirror = 2 * C - i;  // 中心Cを反転した位置

        if (i < R) {
            P[i] = min(R - i, P[mirror]);
        }

        // 回文の拡張
        while (i - P[i] >= 0 && i + P[i] < size && 
               (S[i - P[i]] == S[i + P[i]] || S[i - P[i]] == -1 || S[i + P[i]] == -1)) {
            P[i]++;
        }

        // 中心と右端を更新
        if (i + P[i] > R) {
            C = i;
            R = i + P[i];
        }
    }

    return P;
}

bool check(const vector<int>& S, int N) {
    int size = S.size();

    // Manacher法を使って回文の半径を求める
    vector<int> P = manacher(S, N);

    // 奇数長回文の長さを確認
    for (int i = 0; i < size; ++i) {
        // 奇数長回文:2 * P[i] - 1
        if ((2 * P[i] - 1) > N) {  
            return true;
        }
    }

    // 偶数長回文の長さを確認
    for (int i = 0; i < size; ++i) {
        // 偶数長回文:2 * P[i]
        if (2 * P[i] > N) {  
            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