結果

問題 No.2234 palindromer
ユーザー vjudge1
提出日時 2025-03-22 21:50:03
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 1,770 bytes
コンパイル時間 1,745 ms
コンパイル使用メモリ 166,652 KB
実行使用メモリ 7,324 KB
最終ジャッジ日時 2025-03-22 21:50:06
合計ジャッジ時間 2,758 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 13
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int , int> pi;
typedef unsigned long long ull;
#define endl '\n'
const int N = 2e5 + 10;
const int pri = 131, mod = 998244853;
int n;
int h[N], h2[N];
int p[N] = {1};
int sub (int h[], int l, int r) {
    return (h[r] - 1ll * h[l - 1] * p[r - l + 1] % mod + mod) % mod;
}

signed main() {
    ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
    string s, t;
    cin >> s;
    n = s.size(), t = s;
    reverse(t.begin(), t.end());
    t = '.' + t, s = '.' + s;
    for (int i = 1; i <= n; i ++) p[i] = 1ll * p[i - 1] * pri % mod;
    for (int i = 1; i <= n; i ++) {
        h[i] = (1ll * h[i - 1] * pri % mod + s[i]) % mod;
        h2[i] = (1ll * h2[i - 1] * pri % mod + t[i]) % mod;
    }
    int mi = 2 * n - 1, f = -1;
    for (int i = n / 2; i < n; i ++) {
        if (i < n - i) continue;
        int len = n - i;
        // cout << i << endl;
        if (sub(h2, 1, len) == sub(h, i - len + 1, i)) {
            if (i * 2 < mi) {
                // cout << i << endl;
                mi = i * 2, f = i;
            }
        }
        if (i > len && sub(h2, 1, len) == sub(h, i - len, i - 1)) {
            if (i * 2 - 1 < mi) {
                // cout << i << endl;
                mi = i * 2 - 1, f = i;
            }
        }
    }
    if (mi == 2 * n - 1) {
        for (int i = 1; i <= n; i ++) cout << s[i];
        for (int i = n - 1; i >= 1; i --) cout << s[i];
        return 0;
    }
    if (mi & 1) {
        for (int i = 1; i < f; i ++) cout << s[i];
        cout << s[f];
        for (int i = f - 1; i >= 1; i --) cout << s[i];
    } else {
        for (int i = 1; i <= f; i ++) cout << s[i];
        for (int i = f; i >= 1; i --) cout << s[i];
    }
    return 0;
}
0