1. 程式人生 > >51Nod 1088 最長迴文子串——————Manacher,馬拉車演算法

51Nod 1088 最長迴文子串——————Manacher,馬拉車演算法

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題

迴文串是指  abaabbacccbcccaaaa\;aba、abba、cccbccc、aaaa這種左右對稱的字串。 輸入一個字串StrStr,輸出StrStr裡最長迴文子串的長度。

Input

輸入Str(Str的長度 <= 1000)

Output

輸出最長迴文子串的長度L。

Input示例

daabaac

Output示例

5

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+7; char s[MAXN]; char Ma[MAXN*2]; int Mp[MAXN*2]; void Manacher(char *s,int len) { int l=0; Ma[l++]='$'; Ma[l++]='#'; for(int i=0;i<len;i++) { Ma[l++]=s[i]; Ma[l++]='#'; } Ma[l] = 0; int
id = 0;// int mx = 0;//mx 代表以 id 為中心的最長迴文的右邊界 for(int i=0;i<l;i++) { Mp[i] = mx>i?min(Mp[2*id-i],mx-i):1;// 2*id-i 是 i 關於 id 的對稱點 while(Ma[i + Mp[i]] == Ma[i - Mp[i]] )//左側字元和右側字元相等的話,就讓Mp[i]++ Mp[i]++; if(i +
Mp[i] > mx)//更新mx 和 id 的值 { mx = i + Mp[i]; id = i; } } } int main() { while(~scanf("%s",s)) { int len=strlen(s); int ans=0; Manacher(s,len); for(int i=0;i<2*len+2;i++) ans = max(ans, Mp[i]-1); printf("%d\n",ans); } return 0; }