1. 程式人生 > >L2-008. 最長對稱子串(馬拉車演算法)

L2-008. 最長對稱子串(馬拉車演算法)

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定”Is PAT&TAP symmetric?”,最長對稱子串為”s PAT&TAP s”,於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:
Is PAT&TAP symmetric?
輸出樣例:
11

馬拉車演算法

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std; char s[1005]; char str[2010]; int p[2010]; int index1=0; int main() { gets(s); int lens=strlen(s); int mx=0,id=0; str[index1++]='$'; str[index1++]='#'; for (int i=0;i<lens;i++) { str[index1++]=s[i]; str[index1++]='#'; } for (int i=1;i<index1;i++) { if
(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(str[i-p[i]]==str[i+p[i]]) p[i]++; if (i+p[i]>mx) { mx=p[i]+i; id=i; } } cout<<*max_element(p,p+index1)-1; return 0; }