結果

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

ソースコード

diff #

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

// ワイルドカードに対応した回文判定
bool check(const vector<int>& S, int N) {
    int size = S.size();
    
    // P[i] は i を中心にした回文の半径を格納(Manacher法的)
    vector<int> P(size, 0);  // P[i] は回文の長さ(半径)
    
    int C = 0, R = 0;  // 中心と右端
    
    // 回文の拡張
    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];
        }
        
        // 回文が長すぎた場合
        if (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