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

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 15916    Accepted Submission(s): 5828

    Problem 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
     
    Source
     
    Recommend
    lcy

    Manacher算法。附一个很好懂的讲解:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/

    如果在18行++完,19行不--,而在40行直接输出ans-1的话,比现在这样快了大概70ms

    感受到了细节优化的重要性

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 const int mxn=300000;
     8 char bas[mxn];
     9 char s[mxn];
    10 int p[mxn];
    11 int len;
    12 int mana(){
    13     int id=0,mx=0;
    14     int i,j;
    15     for(i=1;i<len;i++){
    16         if(mx>i)p[i]=min(p[2*id-i],p[id]+id-i);
    17         else p[i]=1;
    18         while(s[i+p[i]]==s[i-p[i]])p[i]++;
    19         p[i]--;//
    20         if(p[i]+i>mx){
    21             mx=p[i]+i;
    22             id=i;
    23         }
    24     }
    25     return 0;
    26 }
    27 int main(){
    28     while(scanf("%s",&bas)!=EOF){
    29         s[0]='$';s[1]='#';
    30         int i,j;
    31         //预处理 
    32         len=strlen(bas);
    33         for(i=0;i<len;i++)
    34             s[i*2+2]=bas[i],s[i*2+3]='#';
    35         len=len*2+2;
    36         s[len]=0;
    37         // 
    38         mana();
    39         int ans=0;
    40         for(i=0;i<len;i++)ans=max(ans,p[i]);//
    41         printf("%d
    ",ans);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5675907.html
Copyright © 2011-2022 走看看