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

    最长回文

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


    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

    分析: manacher算法的模板题,不多说了。

    <span style="font-size:18px;">#include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    #define MAXN 110010
    
    char s[MAXN],str[MAXN*2];
    int p[MAXN*2];
    int n;
    
    void init()
    {
        int i;
        str[0] = '@'; str[1] = '#';
        for(i=0,n=2; s[i]; i++,n+=2)
        {
            str[n] = s[i];
            str[n+1] = '#';
        }
        str[n] = 0;
    }
    
    int solve()
    {
        int id;
        int mx=0;
        int ans = 0;
        for(int i=1; str[i]; i++)
        {
            if(mx > i)
                p[i]=p[2*id-i]>(mx-i)?(mx-i):p[2*id-i];
            else
                p[i] = 1;
            while(str[i-p[i]] == str[i+p[i]]) p[i]++;
            if(p[i]+i > mx)
            {
                mx = p[i] + i;
                id = i;
            }
            if(ans < p[i]) ans = p[i];
        }
        return ans-1;
    }
    
    int main()
    {
        while(scanf("%s",s)!=-1)
        {
            init();
            printf("%d
    ",solve());
        }
    }
    </span>


  • 相关阅读:
    3月6日
    2月28日
    2月23日
    2月20日
    2月19日
    2月18日
    2月17日
    2月16日
    2月15日
    面试算法题——硬币找零
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7123389.html
Copyright © 2011-2022 走看看