马拉车算法
struct Manacher {
int n, huiwen_mx;
string s, str;
vector<int> d;
Manacher(string &str_) {
str = str_;
n = str.size();
get_d();
get();
}
inline void init() {
s.push_back('$');
s.push_back('#');
for (int i = 0; i < n; i++) {
s.push_back(str[i]);
s.push_back('#');
}
d.assign((int)s.size(), 0);
n = s.size() - 1;
}
inline void get_d() {
init();
d[1] = 1;
for (int l, r = 1, i = 2; i <= n; i++) {
if (i <= r) d[i] = min(d[r - i + l], r - i + 1);
while (s[i - d[i]] == s[i + d[i]]) d[i]++;
if (i + d[i] - 1 > r) l = i - d[i] + 1, r = i + d[i] - 1;
}
}
inline void get() {
for (int i = 1; i <= n; i++) {
if (s[i] == '#') {
huiwen_mx = max(huiwen_mx, d[i] - d[i] % 2);
} else {
huiwen_mx = max(huiwen_mx, d[i] - (d[i] % 2 == 0));
}
}
}
};
void solve() {
string s;
cin >> s;
int n = s.size();
Manacher t(s);
cout << t.huiwen_mx << '\n';
}