参数:原串
返回值:最长回文串长度
附:同时记录每一位的最长回文串长度
————————————————————————————————————————————
const int MAXN = 110000 ;
char strOri[MAXN+100];
int maxPalindrome[MAXN*2+100];//最长回文
//manacher,返回最长的回文,同时记录下每位的最长回文
int xManacher(char * mOri)
{
char mStr[MAXN*2+100];
//构造新串
int mLen = strlen(mOri);
mStr[0]='#';
for (int i = 0; i < mLen ; i++)
{
mStr[i*2+1] = mOri[i];
mStr[i*2+2] = '#';
}
//manacher
int k = 1, maxAns = 1;
maxPalindrome[0] = 1, maxPalindrome[1] = 3;
mLen = mLen*2+1;
for (int i = 2; i < mLen ; i++)
{
maxPalindrome[i] = min( maxPalindrome[2*k-i], maxPalindrome[k]-2*(i-k) );
int a = maxPalindrome[i]/2+1;
while ( i-a>=0 && mStr[i-a]==mStr[i+a] ) a++;
maxPalindrome[i] = a*2-1;
k = ( (maxPalindrome[k]/2+k)>(maxPalindrome[i]/2+i) )? k:i;
maxAns = max(maxAns, maxPalindrome[i]/2);
}
return maxAns;
}