classSolution { public: intmaxPalindromes(string s, int k){ // Manacher初始化 string t = ""; for (char& chr : s) t.push_back('#'), t.push_back(chr); t.push_back('#'); int n = t.size(); t = "0" + t; // Manacher int p[4005], c = 0, r = 0; for (int i = 1; i <= n; ++i) { int mirror = 2 * c - i; p[i] = (i <= r && mirror >= 1) ? min(p[mirror], r - i + 1) : 1; while (i - p[i] >= 1 && i + p[i] <= n && t[i - p[i]] == t[i + p[i]]) p[i]++; if (i + p[i] - 1 > r) c = i, r = i + p[i] - 1; } // DP int f[2005]; memset(f, 0, sizeof(f)); n = s.size(); s = "0" + s; for (int i = 1; i <= n; ++i) { f[i] = f[i - 1]; // 长度为k的回文串是否存在 if (i >= k) { int l = i + 1 - k, r = i; if (p[l + r] >= r - l + 1) f[i] = max(f[i], f[l - 1] + 1); } // 长度为k+1的回文串是否存在 if (i >= k + 1) { int l = i - k, r = i; if (p[l + r] >= r - l + 1) f[i] = max(f[i], f[l - 1] + 1); } } return f[n]; } };