結果

問題 No.2858 Make a Palindrome
コンテスト
ユーザー zjsdut
提出日時 2025-11-21 01:20:18
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 1,456 bytes
コンパイル時間 2,022 ms
コンパイル使用メモリ 201,144 KB
実行使用メモリ 15,944 KB
最終ジャッジ日時 2025-11-21 01:20:27
合計ジャッジ時間 8,939 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 20 TLE * 1 -- * 19
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

vector<int> manacher(string s) {
    string t;
    for (char c : s) {
        t = t + '#' + c;
    }
    t += '#';
    int n = t.size();
    vector<int> rad(n, 1);
    int j = 0;
    for (int i = 1; i < n; i++) {
        if (j + rad[j] > i) {
            rad[i] = min(rad[2 * j - i], j + rad[j] - i);
        }
        while (0 <= i - rad[i] && i + rad[i] < n && t[i - rad[i]] == t[i + rad[i]])
            rad[i]++;
        if (j + rad[j] < i + rad[i])
            j = i;
    }
    return rad;
}
void solve() {
    int n, m;
    string s;
    cin >> n >> m >> s;
    vector<int> d = manacher(s + s);
    for (int i = 0; i < 2 * n; i++) {
        d[i] = max(d[i], d[i + 2 * n]) - 1;
    }
    debug(s + s);
    d.resize(2 * n);
    debug(d);
    int ans = INT_MAX;
    for (int i = 0; i < 2 * n; i++) {
        if (d[i] >= m || d[i] >= n) {
            int r = (m + 1 + (i & 1)) / 2; // 回文半径
            int l_need = max(0, r - (i + 1) / 2);
            int r_need = max(0, r - (n - i / 2));
            debug(i, d[i], l_need, r_need);
            ans = min(ans, (l_need + n - 1) / n + (r_need + n  - 1) / n + 1);
        }   
    }
    if (ans == INT_MAX)
        ans = -1;
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
}
0