求出一个串中最长回文串的长度
#include <bits/stdc++.h>
using namespace std;
string str;
char str2[30000000];
int res[30000000];
int ans=0;
int main()
{
cin>>str;
str2[0]='#';str2[1]='*';
for(int i=0,j=2;i<str.size();i++,j+=2)
{
str2[j]=str[i];
str2[j+1]='*';
}
int sz=str.size()*2+2;
for(int i=1,sr=0,mid=0;i<sz;i++)
{
if(i<=sr) res[i]=min(res[(mid<<1)-i],sr-i+1);
while(str2[i-res[i]]==str2[i+res[i]]) res[i]++;
if(res[i]+i>sr) sr=res[i]+i-1,mid=i;
ans=max(ans,res[i]);
}
printf("%d\n",ans-1);
//原最长回文串设为L,新串长度为2L+1,回文半径为L+1
//所以max(res)==L+1,则L为max(res)-1
return 0;
}