zoukankan      html  css  js  c++  java
  • HDU3068 最长回文

     
    Description
    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等
    Input
    输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
    两组case之间由空行隔开(该空行不用处理)
    字符串长度len <= 110000
    Output

    每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
    Sample Input

    aaaa
    
    abab

    Sample Output

    4
    3

    当做是Manacher算法的模板题吧...估计实用价值和KMP没什么区别

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=250010;
     4 char s[N],ss[N];
     5 int RL[N];
     6 int calc(){
     7     ss[0]='#';
     8     for(int i=1,i_end=strlen(s);i<=i_end;++i){
     9         ss[(i<<1)-1]=s[i-1];
    10         ss[(i<<1|1)-1]='#';
    11     }
    12     int len=strlen(s)<<1|1;
    13     int MaxRight=0,pos=0,maxlen=0;
    14     for(int i=0;i<=len;++i){
    15         if(i<MaxRight)RL[i]=min(RL[(pos<<1)-i],MaxRight-i);
    16         else RL[i]=1;
    17         
    18         while(i-RL[i]>=0&&i+RL[i]<=len&&ss[i-RL[i]]==ss[i+RL[i]])++RL[i];
    19         if(RL[i]+i-1>MaxRight)
    20             MaxRight=RL[i]+i-1,pos=i;
    21         maxlen=max(maxlen,RL[i]);
    22     }
    23     return maxlen-1;
    24 }
    25 int main(){
    26     while(~scanf("%s",s))
    27         printf("%d
    ",calc());
    28     return 0;
    29 }
  • 相关阅读:
    STM32f469I discovery烧写demo例程
    dsp5509的中断系统
    DSP5509之采样定理
    DSP5509开发之FPGA接口
    mongodb学习之:安全和认证
    mongodb学习之:GridFS
    tornado之异步web服务一
    mongodb学习之:数据库命令以及固定集合
    docker: Dockerfile命令介绍
    mongodb学习之:聚合
  • 原文地址:https://www.cnblogs.com/ndqzhang1111/p/6905732.html
Copyright © 2011-2022 走看看