题意:求最长回文字串的长度。
思路:manacher模版题。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX_N = 100000;
char s[MAX_N];
char ma[MAX_N*2];
int mp[MAX_N*2];
void manacher(char s[], int len) {
int l = 0;
ma[l++] = '$';
ma[l++] = '#';
for (int i = 0; i < len; i++) {
ma[l++] = s[i];
ma[l++] = '#';
}
ma[l] = 0;
int mx = 0, id = 0;
for (int i = 0; i < l; i++) {
mp[i] = mx > i ? min(mp[2*id-i], mx-i) : 1;
while (ma[i+mp[i]] == ma[i-mp[i]]) mp[i]++;
if (i + mp[i] > mx) {
mx = i + mp[i];
id = i;
}
}
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
fgets(s, MAX_N, stdin);
int len = strlen(s);
manacher(s, len);
int ans = 0;
for (int i = 0; i < len * 2 + 2; i++) {
if (ans < mp[i]) ans = mp[i];
}
ans--;
printf("%d\n", ans);
return 0;
}