Hdu 3068 最长回文(Manacher模版题)

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=220010;
using namespace std;
char str[N];
char tmp[N];
int len[N];
int init(){
    tmp[0]=‘$‘;
    int i=0,nlen=1;
    while(str[i]!=‘\0‘){
        tmp[nlen++]=‘#‘;
        tmp[nlen++]=str[i];
        i++;
    }
    tmp[nlen++]=‘#‘;   tmp[nlen++]=‘$‘;
    tmp[nlen]=0;
    return nlen;
}
int Manacher(int x){
    int mx=0,ans=1,pos=0;
    for(int i=0;i<x;i++){
        len[i]=mx>i?min(mx-i,len[2*pos-i]):1;
        while(tmp[i-len[i]]==tmp[i+len[i]])len[i]++;
        if(len[i]+i>mx){
            mx=len[i]+i;
            pos=i;
        }
        ans=max(ans,len[i]);
    }
    return ans-1;
}
int main(){
    while(~scanf("%s",str)){
        memset(len,0,sizeof(len));
        int x=init();
        printf("%d\n",Manacher(x));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Mrleon/p/8419224.html

时间: 2024-11-08 21:04:18

Hdu 3068 最长回文(Manacher模版题)的相关文章

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068(最长回文-manacher)[Template:manacher]

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9660    Accepted Submission(s): 3353 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068 最长回文(manacher算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=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 每

HDU 3068 最长回文(Manacher)

题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题意 给出一个只由小写英文字符a,b,c-y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 思路 用特殊字符插入到s串中每两个字符中间,实现每个回文串都是奇数,再用manacher算法进行求解. 代码 #include <iostream> #include <algorithm> #include <cstring

hdu 3068 最长回文(manacher入门)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11553    Accepted Submission(s): 4191 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组c

HDU 3068 最长回文

最长回文串模板题 Manacher 算法 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdlib> 6 #include<string> 7 #include<cmath> 8 #include<vector> 9 using namespace std; 10 co

HDU 3068 最长回文(初遇manacher)

这题可用拓展KMP分治法来做http://blog.sina.cn/dpool/blog/s/blog_677a3eb30100knj8.html 复杂度O(nlogn)这种方法好复杂而且代码很长,不易理解. 相比之下Manacher就简单多了,算法本身也很简单 这里个易懂的资料http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 复杂度O(n) kuangbin的模版(有一处修改) /* * 求最长回文子串 */ const int

HDU - 3068 最长回文(manacher算法)

题意:给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 分析: manacher算法: 1.将字符串中每个字符的两边都插入一个特殊字符.(此操作的目的是,将字符串长度统一变成奇数,道理很容易想---奇数+偶数=奇数or偶数+奇数=奇数) eg:abba--->#a#b#b#a# 此外,为了便于处理边界,可在字符串开始处再加另外一个特殊字符. eg:#a#b#b#a#--->$#a#b#b#a# 2.数组 P[i] 来记录以字符S[i]为中心的最长回文子串向

hdu 3068 最长回文串 o(n) Manacher 算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10596    Accepted Submission(s): 3759 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多