結果
| 問題 |
No.958 たぷりすたべる (回文)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-21 00:08:18 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 313 ms / 2,000 ms |
| コード長 | 1,122 bytes |
| コンパイル時間 | 1,631 ms |
| コンパイル使用メモリ | 171,960 KB |
| 実行使用メモリ | 12,072 KB |
| 最終ジャッジ日時 | 2024-07-18 04:56:44 |
| 合計ジャッジ時間 | 9,185 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repr(i, n) for (int i = (n) - 1; i >= 0; i--)
#define rep2(i, l, r) for (int i = (l); i < (r); i++)
#define rep2r(i, l, r) for (int i = (r) - 1; i >= (l); i--)
#define range(a) a.begin(), a.end()
using namespace std;
using ll = long long;
vector<int> manacher(string s) {
const int n = s.size();
vector<int> rad(n);
int i = 0;
int k = 0;
while (i < n) {
while (i-k-1>=0 && i+k+1<n && s[i-k-1]==s[i+k+1]) k++;
rad[i] = k;
int j = 1;
k--;
while (rad[i-j]<k) {
rad[i+j] = rad[i-j];
j++; k--;
}
i += j;
}
return rad;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(15);
ll N, K, Q; cin >> N >> K >> Q;
string S; cin >> S;
auto m1 = manacher(S + S + S);
auto m2 = manacher(S + S + S + S + S);
while (Q--) {
ll A; cin >> A; A--;
ll r1 = m1[A % N + N];
ll r2 = m2[A % N + 2*N];
if (r1 != r2) {
cout << min(A, N*K-1-A)*2+1 << endl;
continue;
}
cout << min(r2, min(A, N*K-1-A))*2+1 << endl;
}
}