zoukankan      html  css  js  c++  java
  • hdu 3068 最长回文 manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等
     
    题目描述:中文题,不翻译。
    算法分析:求解最长回文串的长度,当选O(n)的manacher算法。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<vector>
     8 #define inf 0x7fffffff
     9 using namespace std;
    10 typedef long long LL;
    11 const int maxn=110000+100;
    12 char str[maxn],s[3*maxn+1000];
    13 int p[3*maxn+100],cnt;
    14 void manacher()
    15 {
    16     int mx=0,id=0;
    17     for (int i=1 ;i<cnt ;i++)
    18     {
    19         if (mx>i) p[i]=min(p[2*id-i],mx-i);
    20         else p[i]=1;
    21         for ( ;s[i+p[i] ]==s[i-p[i] ] ;p[i]++) ;
    22         if (p[i]+i>mx)
    23         {
    24             mx=p[i]+i;
    25             id=i;
    26         }
    27     }
    28     //cout<<p[id]-1<<endl;
    29     int ans=0;
    30     for (int i=1 ;i<cnt ;i++) ans=max(ans,p[i]);
    31     cout<<ans-1<<endl;
    32 }
    33 int main()
    34 {
    35     memset(str,0,sizeof(str));
    36     while (scanf("%s",str)!=EOF)
    37     {
    38         cnt=0;
    39         memset(s,0,sizeof(s));
    40         memset(p,0,sizeof(p));
    41         s[cnt++]='$';
    42         int len=strlen(str);
    43         for (int i=0 ;i<len ;i++)
    44         {
    45             s[cnt++]='#';
    46             s[cnt++]=str[i];
    47         }
    48         s[cnt++]='#';
    49         s[cnt]=0;
    50         manacher();
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    First duplicate value
    SQL学习笔记day1
    Find closest value in BST
    BST construction
    Closest sum_pair
    滑动窗口 sliding window
    设计模式(3)观察者模式
    设计模式(1)装饰模式总结
    深刻探讨public class=new class();
    与时间赛跑,我的2012
  • 原文地址:https://www.cnblogs.com/huangxf/p/4339855.html
Copyright © 2011-2022 走看看