首页 > 代码库 > 最长回文 HDU - 3068

最长回文 HDU - 3068

给出一个只由小写英文字符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