1 条题解
-
0
拉拉队排练(Cheerleading Rehearsal) 题解
思路分析
按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。
参考代码
#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; const long long MOD = 19930726; long long qpow(long long a, long long b) { long long res = 1; a %= MOD; while (b > 0) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; long long K; if (!(cin >> n >> K)) return 0; string s; cin >> s; vector<int> d1(n, 0); int l = 0, r = -1; vector<long long> cnt(n + 2, 0); for (int i = 0; i < n; ++i) { int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1); while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) ++k; d1[i] = k--; if (i + k > r) { l = i - k; r = i + k; } int max_len = 2 * d1[i] - 1; cnt[max_len]++; } long long ans = 1; long long cur = 0; for (int len = (n % 2 == 1 ? n : n - 1); len >= 1; len -= 2) { cur += cnt[len]; if (cur == 0) continue; long long take = min(K, cur); ans = ans * qpow(len, take) % MOD; K -= take; if (K == 0) break; } if (K > 0) cout << -1 << "\n"; else cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 8576
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者