hdu3068 最长回文 manacher

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等

 

manacher裸题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int maxn=11e4+5;
 7 char s[maxn],t[maxn<<1];
 8 int p[maxn<<1];
 9 
10 void manacher(){
11     int len=strlen(s),l=0;
12     t[l++]='$';
13     t[l++]='#';
14     for(int i=0;i<len;++i){
15         t[l++]=s[i];
16         t[l++]='#';
17     }
18     t[l]=0;
19     int maxx=0,num=0;
20     for(int i=0;i<l;++i){
21         p[i]=maxx>i?min(p[2*num-i],maxx-i):1;
22         while(t[i+p[i]]==t[i-p[i]])p[i]++;
23         if(i+p[i]>maxx){
24             maxx=i+p[i];
25             num=i;
26         }
27     }
28 }
29 
30 int main(){
31     while(scanf("%s",s)!=EOF){
32         manacher();
33         int l=strlen(s);
34         int ans=0;
35         for(int i=0;i<2*l+2;++i){
36             if(p[i]-1>ans)ans=p[i]-1;
37         }
38         printf("%d\n",ans);
39     }
40     return 0;
41 }
View Code

 

转载于:https://www.cnblogs.com/cenariusxz/p/6592537.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值