51Nod 1088 最長迴文子串——————Manacher,馬拉車演算法
阿新 • • 發佈:2018-12-16
基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題
迴文串是指這種左右對稱的字串。 輸入一個字串,輸出裡最長迴文子串的長度。
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;
}