manacher 算法
class Solution {
public:
int flag[2003];
char word[2007];
char res[2007];
string longestPalindrome(string s) {
word[0] = '$';
int n = s.length();
for(int i = 0;i < n; i++){
word[i*2+1]=s[i];
word[i*2+2]='#';
}
word[n*2+1] = '$';
flag[1] = 1;
int right = 1,id=1,ans=1,len=0;
n *= 2;
for(int i = 1;i < n; i++){
flag[i] = min(flag[id*2-i],right-i);
while(word[i+flag[i]] == word[i-flag[i]])
flag[i]++;
if(flag[i] + i >= right){
id = i;
right = flag[i] + i;
}
if(flag[i] > len){
len = flag[i];
ans = i;
}
}
int cnt = 0;
for(int i = ans - len + 1; i < ans + len; i++){
if(word[i] != '#')
res[cnt++] = word[i];
}
res[cnt] = '\0';
return res;
}
};