manacher
从前往后找对称中心,计算扩展长度知道该中心包含最后一个字符
再根据对称性,计算出前面需要反转后添加的长度
```cpp
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string str;
cin >> str;
string mstr;
mstr += '$';
for(int i = 0;i < str.size();++i){
mstr += '#';
mstr += str[i];
}
mstr += '#';
mstr += '?';
int p[2000*2 + 10];
int c = 0;
int mRb = 0;
p[0] = 0;
for(int i = 0;i < mstr.size();++i){
int lp = 2 * c - i;
p[i] = min(p[lp], mRb - i);
while(mstr[i - p[i]] == mstr[i + p[i]])
p[i]++;
if(p[i] + i > mRb){
mRb = p[i] + i;
c = i;
}
}
int pos = mstr.size();
for(int i = 0;i < mstr.size();++i){
if(i + p[i] == mstr.size() - 1){
int tmp = i - p[i];
pos = tmp/2;
break;
}
}
//printf("%d\n", pos);
string appstr = str.substr(0, pos);
reverse(appstr.begin(), appstr.end());
str += appstr;
cout << str;
return 0;
}