最长回文 HDU - 3068
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长回文 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的主要内容,如果未能解决你的问题,请参考以下文章