• hdu-3068-最长回文(manacher算法模板)


    题目链接

     1 /*
     2     Name:hdu-3068-最长回文
     3     Copyright:
     4     Author:
     5     Date: 2018/4/24 16:12:45
     6     Description:
     7     manacher算法模板 
     8 */
     9 #include <iostream>
    10 #include <cstdio>
    11 #include <string>
    12 #include <cstring>
    13 #include <math.h>
    14 #include <algorithm>
    15 using namespace std;
    16 const int MAXN = 110005 * 2;//字符串长度*2 
    17 
    18 void manacher(char str[],int len[],int n){//接口
    19     len[0] = 1;
    20     for(int i = 1,j = 0; i < (n<<1) - 1;++ i){
    21         int p = i >> 1,q = i - p, r = ((j+1) >> 1) + len[j] - 1;
    22         len[i] = r < q?0:min(r-q+1,len[(j<<1) - i]);
    23         while(p > len[i] - 1 && q + len[i] < n && str[p - len[i]] == str[q+len[i]]) ++len[i];
    24         if(q + len[i] - 1 > r) j = i;
    25     }
    26 }
    27 struct Solution {
    28     string longestPalindrome(string s) {
    29         int n = s.size();
    30         int len[MAXN];
    31         char *str = &s[0];
    32         manacher(str,len,n);//调用接口,得到len[]
    33         string tmp = "";
    34         int pos = 0,max_len = 0;
    35         for(int i = 0;i < (n<<1) - 1; ++ i){
    36             int tmp_len = (i&1)?len[i]<<1:(len[i]<<1)-1; //以‘#’or字符为中心,串长不一样
    37             if(tmp_len > max_len) pos = i,max_len = tmp_len; //pos记录目标串的中心点,max_len表示目标串的串长(不含#)
    38             if(i&1) tmp+="#"; else tmp+=s[i>>1];    //作一个tmp[0..2n-1]的字符串,便于输出
    39         }
    40         if(pos&1){   //找到要打印的串tmp的起始位置pos和打印长度max_len(便于打印输出)
    41           max_len = (len[pos] << 2) - 1;
    42           pos = pos - (len[pos] << 1) + 1;
    43         }
    44         else{
    45            max_len = (len[pos] << 2) - 3;
    46            pos = pos - ((len[pos]-1)<<1);
    47         }
    48         string ans = "";
    49         for(int i = pos,j = 0;j < max_len;++ j,++ i){
    50             if(i&1) continue;
    51             ans+=tmp[i];     //tmp中找到所要打印的字符,链接起来
    52         }
    53         return ans;
    54     }
    55 };
    56 
    57 int main()
    58 {
    59 //    freopen("in.txt", "r", stdin);
    60     string str;
    61     while (cin >> str) {
    62         getchar();
    63         Solution tmp;
    64         cout<<tmp.longestPalindrome(str).size()<<endl; 
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    如何判定某个类的职责是否够"单一"?
    Guava中的Cache简易源码分析
    为什么尽量少用继承?
    聊聊抽象类和接口
    WINDOW 搭建 ELK 2.4.0
    摇摇棒,理工男的择偶权(上)
    C++值多态:传统多态与类型擦除之间
    C++值元编程
    STM32学习笔记——printf
    C++98/11/17表达式类别
  • 原文地址:https://www.cnblogs.com/slothrbk/p/8931917.html
Copyright © 2020-2023  润新知