线性求最长回文字串
#include<bits/stdc++.h>
using namespace std;
//马拉车,最长回文字串
string Manacher(string s)//返回字符串
//int Manacher(string s) //返回长度
{
string t="$#";//处理开头
for(int i=0;i<s.size();i++){
t+=s[i];
t+="#"; //穿插加入'#',保证回文串全为奇数
}
vector<int>p(t.size(),0);
int max_mid=0,max_right=0;
int res_mid=-1,res_len=1;
for(int i=1;i<t.size();i++){
p[i]=max_right>i ? min(p[2*max_mid-i],max_right-i):1;
while(t[i+p[i]]==t[i-p[i]]){ //手动匹配
p[i]++;
}
if(max_right<i+p[i]){ //更新最右边
max_right=i+p[i];
max_mid=i;
}
if(res_len<p[i]){ //记录最大值
res_len=p[i];
res_mid=i;
}
}
return s.substr((res_mid-res_len)/2,res_len-1);//返回字符串
//return res_len-1; //返回长度
}
int main()
{
string s;
cin>>s;
cout<<"s的最长回文字串是:"<<Manacher(s)<<endl;
return 0;
}