1 条题解
-
0
最长双回文串(Longest Double Palindrome) 题解
思路分析
按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。
参考代码
#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string s; if (!(cin >> s)) return 0; string t = "^#"; for (char c : s) { t += c; t += '#'; } t += '$'; int m = (int)t.size(); vector<int> p(m, 0), L(m, 0), R(m, 0); int c = 0, r = 0; for (int i = 1; i < m - 1; ++i) { int i_mirror = 2 * c - i; if (r > i) p[i] = min(r - i, p[i_mirror]); while (t[i + 1 + p[i]] == t[i - 1 - p[i]]) ++p[i]; if (i + p[i] > r) { c = i; r = i + p[i]; } L[i + p[i]] = max(L[i + p[i]], p[i]); R[i - p[i]] = max(R[i - p[i]], p[i]); } for (int i = m - 3; i >= 1; i -= 2) L[i] = max(L[i], L[i + 2] - 2); for (int i = 3; i < m - 1; i += 2) R[i] = max(R[i], R[i - 2] - 2); int ans = 0; for (int i = 3; i < m - 2; i += 2) { if (L[i] > 0 && R[i] > 0) ans = max(ans, L[i] + R[i]); } cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 8580
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者