注意点:
1.读入字符串的时候,最好用getline读入一行,而非cin
2.由于使用manacher算法,字符串长度会被扩充一倍,所以长度最好是题目给定长度的两倍
3.注意更新半径中心
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 2e5+5;
int p[maxn];
int main(){
string str, res = "$#";
getline(cin, str);
//改造字符串
for(auto c: str){
res += c;
res += "#";
}
//马拉车算法
int len = 0;
int r = 1, c = 0;
p[0] = 1;
for(int i = 1; i < res.size(); i++){
p[i] = r > i ? min(p[2*c - i], r - i) : 1;
while(res[i - p[i]] == res[i + p[i]]) p[i]++;
if(p[i] + i > r){
r = p[i] + i;
c = i;
}
len = max(len, p[i]);
}
cout<< len - 1 << endl;
return 0;
}