結果

問題 No.1053 ゲーミング棒
ユーザー 🍮かんプリン
提出日時 2020-05-15 22:44:11
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
WA  
実行時間 -
コード長 1,634 bytes
コンパイル時間 1,453 ms
コンパイル使用メモリ 164,820 KB
実行使用メモリ 5,760 KB
最終ジャッジ日時 2024-09-19 11:56:17
合計ジャッジ時間 2,456 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 21 WA * 13
権限があれば一括ダウンロードができます

ソースコード

diff #

/**
 *   @FileName	f.cpp
 *   @Author	kanpurin
 *   @Created	2020.05.15 22:44:01
**/

#include "bits/stdc++.h" 
using namespace std; 
typedef long long ll;

// KMP法 O(N)
// verify : https://atcoder.jp/contests/abc135/tasks/abc135_f
template<typename T>
class KMP {
public:
    vector<T> pattern;
    int plen;
    vector<int> table;
    // tからsを探す(sを引数に)
    KMP(const vector<T>& s) : pattern(s), plen((int)pattern.size()), table(plen + 1) {
        table[0] = -1;
        int j = -1;
        for (int i = 0; i < plen; i++) {
            while (j >= 0 && pattern[i] != pattern[j]) j = table[j];
            j++;
            if (i + 1 < plen && pattern[i + 1] == pattern[j]) table[i + 1] = table[j];
            else table[i + 1] = j;
        }
    }
    // マッチする左端の箇所
    vector<int> search(const vector<T>& text) {
        vector<int> res;
        int head = 0, j = 0, tlen = (int)text.size();
        while (head + j < tlen) {
            if (pattern[j] == text[head + j]) {
                if (++j != plen) continue;
                res.push_back(head);
            }
            head += j - table[j], j = max(table[j], 0);
        }
        return res;
    }
};
int main() {
    int n;cin >> n;
    vector<int> a(n);
    vector<int> b(2*n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        b[i] = b[i + n] = a[i];
    }
    sort(a.begin(), a.end());
    KMP<int> kmp(a);
    auto p = kmp.search(b);
    if (p.size() == 0) {
        cout << -1 << endl;
    }
    else if (p[0] == 0) {
        cout << 0 << endl;
    }
    else {
        cout << 1 << endl;
    }
    return 0;
}
0