1. 程式人生 > >最長回文 HDU - 3068

最長回文 HDU - 3068

while pac == pan pri scanf 表示 sam ace

給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.
回文就是正反讀都是一樣的字符串,如aba, abba等Input輸入有多組case,不超過120組,每組輸入為一行小寫英文字符a,b,c...y,z組成的字符串S
兩組case之間由空行隔開(該空行不用處理)
字符串長度len <= 110000Output每一行一個整數x,對應一組case,表示該組case的字符串中所包含的最長回文長度.
Sample Input

aaaa

abab

Sample Output

4
3

orzzzzzz,Manacher算法的模板題,因為Mp數組只開了一半,wa了10多次。。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=110005;
 5 
 6 int Mp[maxn*2];
 7 char s[maxn],Ma[2*maxn];
 8 
 9 void Mana(char *s,int len){
10     Ma[0]=$;Ma[1]=#;
11     int l=2;
12     for(int i=0;i<len;i++){
13         Ma[l++]=s[i];
14         Ma[l++]=#;
15     } 
16 Ma[l]=0; 17 18 int mx=0,id=0,ans=0; 19 for(int i=0;i<l;i++){ 20 if(mx>i) Mp[i]=min(mx-i,Mp[2*id-i]); 21 else Mp[i]=1; 22 while(Ma[i+Mp[i]]==Ma[i-Mp[i]]) ++Mp[i]; 23 ans=max(ans,Mp[i]-1); 24 if(i+Mp[i]>mx){ 25 mx=i+Mp[i]; 26 id=i;
27 } 28 } 29 printf("%d\n",ans); 30 } 31 32 int main() 33 { while(scanf("%s",s)==1){ 34 int len=strlen(s); 35 Mana(s,len); 36 } 37 return 0; 38 }

最長回文 HDU - 3068