马拉车求最长回文子串
class Solution {
const static int N=1e5+5;
char ss[N];
int L[N];
public:
string longestPalindrome(string s) {
int len=0;
ss[len++]='$';
for(int i=0;i<s.size();i++)
ss[len++]='#',ss[len++]=s[i];
ss[len]='#',ss[len+1]='\0';
int pos=0,mxx=0,ans=0,ansp=0;
for(int i=1;i<=len;i++)
{
if(mxx>i) L[i]=min(mxx-i+1,L[2*pos-i]);
else L[i]=1;
while(ss[i+L[i]]==ss[i-L[i]]) L[i]++;
if(i+L[i]-1>mxx) mxx=i+L[i]-1,pos=i;
if(L[i]>ans) ans=L[i],ansp=i;
}
string sss="";
for(int i=ansp-ans+1;i<ansp+ans;i++)
if(ss[i]!='#')
sss+=ss[i];
return sss;
}
};