最长回文 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的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3068 最长回文

HDU 3068 最长回文(manacher模板题)

HDU 3068 最长回文(Manacher)

HDU 3068 最长回文

HDU 3068 最长回文

HDU3068 最长回文 MANACHER+回文串