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

     
    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
     

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 3e5;
    char s[maxn], str[maxn];
    int len[maxn];
    int ls, id, mx;
    
    void init() {
        int k = 0;
        str[k ++] = '$';
        for(int i = 0; i < ls; i ++) {
            str[k ++] = '#';
            str[k ++] = s[i];
        }
        str[k ++] = '#';
        ls = k;
    }
    
    int Manacher() {
        len[0] = 0;
        int sum = 0;
        mx = 0;
        for(int i = 1; i < ls; i ++) {
            if(i < mx)
                len[i] = min(mx - i, len[2 * id - i]);
            else len[i] = 1;
            while(str[i - len[i]] == str[i + len[i]])
                len[i] ++;
            if(len[i] + i > mx) {
                mx = len[i] + i;
                id = i;
                sum = max(sum, len[i]);
            }
        }
        return (sum - 1);
    }
    
    int main() {
        while(~scanf("%s", s)) {
            memset(str, 0, sizeof(str));
            ls = strlen(s);
            init();
            int ans = Manacher();
            printf("%d
    ", ans);
        }
        return 0;
    }
    

      Manacher 模板题 用 string TLE。。。改到 char 就 AC 了 差这么多的么。。。

     

  • 相关阅读:
    Redis详解
    Linux常用命令
    sqlserver 游标写法
    Flask总结
    HTTPS协议
    Django REST framework 简介
    Cookie和session
    利用rest-framework编写逻辑关系
    vuex
    jQuery和Bootstrap的优点
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10790683.html
Copyright © 2011-2022 走看看