POJ 3974-Palindrome(Manacher算法)

题目地址:POJ 3974

题意:求最长的回文串。

思路:同样是用Mancher算法在O(n)的时间内解决(我其实是来练练板子的

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=1000010;
char str[maxn];
char s[maxn*2];
int p[maxn*2];
int n;
void Manacher()
{
    int i;
    for(i=1; str[i]!=‘\0‘; i++) {
        s[i*2]=str[i];
        s[i*2+1]=‘#‘;
    }
    s[0]=‘$‘;
    s[1]=‘#‘;
    n=i*2+2;
    s[n]=‘\0‘;
    int MaxL,id=0;
    MaxL=0;
    memset(p,0,sizeof(p));
    for(int i=1; i<n; i++) {
        if(p[id]+id>i)
            p[i]=min(p[2*id-i],p[id]+id-i);
        else
            p[i]=1;
        while(s[i+p[i]]==s[i-p[i]])
            p[i]++;
        if(p[i]+i>p[id]+id) {
            id=i;
        }
        if(p[i]>MaxL)
            MaxL=p[i];
    }
    printf("%d\n",MaxL-1);
}
int main()
{
    int icase=1;
    while(~scanf("%s",&str[1])) {
        if(strcmp(str+1,"END")==0)
            break;
        printf("Case %d: ",icase++);
        Manacher();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-15 13:18:43

POJ 3974-Palindrome(Manacher算法)的相关文章

POJ 3974 Palindrome Manacher算法题解

本题就是求最长的回文子串. 字符串超长,不过限时却是也很长的15秒,最长的限时之一题目了,如果限时短点的话,估计能过的人不多. 使用Mancher算法是可以秒杀的. 模板式的Manacher算法: #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #inc

POJ 3974 Palindrome Manacher

题目大意 给出一个字符串,求出这个字符串的最长回文子串. 思路 前来学习著名的Manacher算法. 这是一个线性时间求出回文子串的算法.具体来说,对于我们弄出的一个回文串,它对于后面的串并不是,没有用的,因为它的左右两侧是相同的,那么自然可以用左边的信息去更新右边. 设p[i]为第i个字符的回文半径,_max为max{p[i]+i},也就是最远可以更新的点.之后枚举的时候,如果当前点的位置小于_max,那么就用之前的信息去更新当前位置.否则p[i]=1.之后暴力向两边匹配.然后它就O(n)啦!

POJ 3974 Palindrome | 马拉车模板

给一个字符串,求最长回文字串有多长 #include<cstdio> #include<algorithm> #include<cstring> #define N 1000005 using namespace std; int n,m,T,p[N*2],ans; char s[2*N],t[N]; void manacher() { int id=0,pos=0,x=0; for (int i=1;i<+n;i++) { if (pos>i) x=min

poj 3974 Palindrome

/* 裸地manachar */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 using namespace std; int l,len[maxn]; char s[maxn],ss[maxn]; int manachar() { int ans=0; int id=-1,mx=-1; for(int i=1;i<=l;i++) { if(id+mx-i&g

后缀数组 POJ 3974 Palindrome &amp;&amp; URAL 1297 Palindrome

题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串中心位置,RMQ询问LCP = min (height[rank[l]+1] to height[rank[r]]),注意的是RMQ传入参数最好是后缀的位置,因为它们在树上的顺序未知,且左边还要+1. #include <cstdio> #include <algorithm> #in

【转载】Manacher算法

本文原创:http://www.cnblogs.com/BigBallon/p/3816890.html只为了记录学习,不为抄袭!http://www.felix021.com/blog/read.php?2040 对于Manacher算法,主要的作用是用来求一个字符串的最长回文子串.这个算法的时间复杂度书线性的,即O(n)下面我分两个部分来讲1)预处理这个算法的精妙之处在于巧妙地避免了考虑回文子串的长度是奇数还是偶数(如果你还不知道什么是回文数,回文串,请自行baidu)在Manacher算法

【POJ 3974】 Palindrome

[POJ 3974] Palindrome Manacher纯模板题 忘记的时候可以拿来找感觉 代码如下: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; char str[1111111]; char nwstr[2333333]; int p[2333333]; int Manacher() { int len

Palindrome(最长回文串manacher算法)O(n)

Palindrome Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "

【URAL】1297 Palindrome【字符串--manacher算法】

传送门:Palindrome 题意 求最长回文字符串,在学manacher算法,所以用了manacher,看到网上好多题解使用后缀数组来做的. 思路 manacher算法,参考<ACM国际大学生程序设计竞赛 算法与实现>的板子,一开始我以为板子的manacher算法是错误的,然后上网看题解. 直到我看到 https://blog.csdn.net/u012717411/article/details/53363444 文章,我才知道其实人家是对的,只不过我没理解. manacher算法在O(N