思路是反着做一遍 Manacher
,查找最长的回文子串长度,然后再相减。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 8 * 1e5 + 10;
string s;
string t;
int p[N];
vector<char> vec;
int n;
int ans = INT_MIN;
signed main() {
cin >> n;
cin >> s;
reverse(s.begin(), s.end());
t = s;
vec.push_back('$');
for (auto k : t) {
vec.push_back('#');
vec.push_back(k);
}
vec.push_back('#');
int sz = vec.size();
for (int i = 1, r = 0, mid = 0;i < sz;++i) {
if (i <= r) {
p[i] = max(p[(mid << 1) - i], r - i + 1);
}
while (vec[i + p[i]] == vec[i - p[i]])
p[i]++;
if (p[i] + i - 1 > r) {
r = p[i] + i - 1;
mid = i;
}
if (p[i]==i) {
ans = max(ans, p[i]);
}
}
cout << n-ans+1 << "\n";
return 0;
}