首页 > 代码库 > 最长回文 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。