結果
問題 | No.958 たぷりすたべる (回文) |
ユーザー |
![]() |
提出日時 | 2019-12-17 17:11:55 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,618 bytes |
コンパイル時間 | 2,916 ms |
コンパイル使用メモリ | 198,148 KB |
最終ジャッジ日時 | 2025-01-08 11:55:10 |
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 2 |
other | AC * 1 WA * 52 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;const ll mod = 998244353;vector<int> manacher(string s){int i = 0, j = 0;vector<int> res(s.size());while (i < s.size()) {while (i - j >= 0 && i + j < s.size() && s[i - j] == s[i + j]) ++j;res[i] = j;int k = 1;while (i - k >= 0 && i + k < s.size() && k + res[i - k] < j) res[i + k] = res[i - k], ++k;i += k; j -= k;}return res;}int main(){string s;ll k;cin >> s >> k;ll n = s.size();string t = "$";for(int i = 0; i < min(k, 3LL); i++){for(int j = 0; j < n; j++){t += s[j];t += "$";}}vector<int> a = manacher(t);ll ans = 0;if(k <= 3){for(int i = 0; i < a.size(); i++){ans = (ans + a[i] / 2) % mod;}cout << ans << endl;return 0;}for(int i = 0; i < 2 * n; i++){ans = (ans + a[i] / 2) % mod;}ll l = (k + 1) / 2, r = k / 2;for(int i = 2 * n; i < 4 * n; i++){if(i - a[i] + 1 == 0 || i + a[i] - 1 == 6 * n){ll mr = min(i - 2 * n + 1, 4 * n - i + 1) / 2;ll Mr = max(i - 2 * n + 1, 4 * n - i + 1) / 2;ans = (ans + l * (l - 1) / 2 % mod * n % mod + (l - 1) * mr % mod) % mod;ans = (ans + r * (r - 1) / 2 % mod * n % mod + (r - 1) * Mr % mod) % mod;}else{ans = (ans + a[i] / 2 * (k - 2) % mod) % mod;}}for(int i = 4 * n; i < 6 * n; i++){ans = (ans + a[i] / 2) % mod;}cout << ans << endl;}