HDU3068 manacher算法

  附上题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068  这个题的意思是给你一个串, 求这个串中的最长的回文串的长度, 直接裸manacher即可。 代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;
const int maxn = 110000*2+100;
char input[maxn];
char a[maxn]; int p[maxn]; //manacher

void manacher(char *s){
    int len = strlen(s+1);
    int m = 2*len+1;
    for(int i=1; i<=len; i++){
        a[i<<1] = s[i];
        a[i<<1|1] = ‘#‘;
    }
    a[0] = ‘+‘; a[1] = ‘#‘; a[m+1] = ‘-‘;
   // cout<<a<<endl;
    int mx=0, idx;
    int res = 0;
    for(int i=1; i<=m; i++) {
        if(mx > i)
            p[i] = min(p[2*idx-i], mx-i);
        else
            p[i] = 1;
        for(; a[i-p[i]]==a[i+p[i]]; p[i]++);
        if(p[i]+i > mx) mx = p[i]+i, idx=i;
        res = max(res, p[i]);
    }
    cout<<res-1<<endl;
//    for(int i=1; i<=m; i++)
//        cout<<p[i]<<‘ ‘;
//    cout<<endl;
}

int main() {
    while(scanf("%s", input+1) != EOF){
        manacher(input);
    }
    return 0;
}
时间: 2024-10-10 07:24:30

HDU3068 manacher算法的相关文章

HDU3068 最长回文【manacher算法】

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

最长回文---hdu3068 (回文串 manacher 算法模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意很清楚:就是求一个串s的子串中最长回文串的长度:这类题用到了manacher算法 manacher算法(复制大神的解释): 定义数组p[i]表示以i为中心的(包含i这个字符)回文串半径长 将字符串s从前扫到后for(int i=0;i<strlen(s);++i)来计算p[i],则最大的p[i]就是最长回文串长度,则问题是如何去求p[i]? 由于s是从前扫到后的,所以需要计算p[i]时一定

hdu-3068 最长回文 【Manacher算法】

Manacher算法学习资料:http://blog.csdn.net/dyx404514/article/details/42061017 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9282    Accepted Submission(s): 3194 Problem Description 给出一个只由小写英文字符

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

hdu3068 最长回文(manacher 算法)

题意: 给定字符串,求字符串中的最长回文序列 解题思路: manacher 算法 时间复杂度:O(N) 代码: #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 110010 using namespace std; char b[MAXN],a[MAXN<<1]; int p[MAXN<<1]; int n; int main(){ while(scan

【最长回文子串】HDU3068最长回文【Manacher算法】

一张图领悟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之间由空行隔开(该空行不用处理)

[hdu3068]最长回文(Manacher算法)

http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求最长回文串的长度. 解题关键:Manacher算法 引用一个较好的解释 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; 可以这么说,这行要是理解了,那么马拉车算法基本上就没啥问题了,那么这一行代码拆开来看就是 如果mx > i, 则 p[i] = min(p[2 * id - i], mx - i) 否则, p[i] = 1 当 mx - i

HDU3068(最长回文子串manacher算法)

题目连接:点击打开链接 解题思路: manacher算法模板题. 完整代码: #include <algorithm> #include <iostream> #include <cstring> #include <complex> #include <cstdio> #include <string> #include <cmath> #include <queue> using namespace std

hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

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