HDU 3294 Girls' research (Manacher算法 + 记录区间)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294

题目大意:输入一个字符ch和一个字符串,问如果把ch当作‘a‘的话,字符串的每个字符也要做相应变化,如b aa,若b为‘a‘,则b前面的a就为‘a‘前面的‘z‘,这里是循环表示,输出字符串的最长回文子串,如果最长回文子串串长为1,输出No solution!

几乎是模板题,唯一的特别之处就是要输出回文串字符,所以要记录max(Mp[i])对应的在原串中的字符区间,根据Manacher算法的步骤逆推即可,所以要对算法的基础步骤要熟练,毕竟是简单的算法。

//171MS 2536K
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 200100
using namespace std;
int Mp[M<<1];
char s[M],Ma[M<<1];
int maxn,L,R;
void Manacher(char s[],int len)
{
    int l=0;
    Ma[l++]='$';
    Ma[l++]='#';
    for(int i=0;i<len;i++){
        Ma[l++]=s[i];
        Ma[l++]='#';
    }
    Ma[l]=0;
    int mx=0,id=0;
    for(int i=1;i<l ;i++){
        Mp[i]= mx>i? min(Mp[2*id-i],mx-i) :1;
        while(Ma[Mp[i]+i ]==Ma[i-Mp[i] ]) Mp[i]++;
        if(Mp[i]+i>mx){
            mx=Mp[i]+i;
            id=i;
        }
        if(Mp[i]-1>maxn){
            maxn=Mp[i]-1;
            L = (i-Mp[i])>>1;   //根据对原串的处理逆推
            R = (i+Mp[i]-4)>>1; //根据对原串的处理逆推
        }
    }
}
int main ()
{
    char a[5];
    while(~scanf("%s%s",a,s)){
        maxn=-1;
        int len=strlen(s);
        Manacher(s,len);
        if(maxn==1) printf("No solution!");
        else {
            printf("%d %d\n",L,R);
            for(int i=L;i<=R;i++){
                printf("%c",'a'+((s[i]-a[0])+26)%26); //小技巧,把值循环圈定在26个字母范围内
            }
        }
        puts("");
    }
    return 0;
}

HDU 3294 Girls' research (Manacher算法 + 记录区间)

时间: 2024-12-27 10:16:33

HDU 3294 Girls' research (Manacher算法 + 记录区间)的相关文章

Hdu 3294 Girls&#39; research (manacher 最长回文串)

题目链接: Hdu 3294  Girls' research 题目描述: 给出一串字符串代表暗码,暗码字符是通过明码循环移位得到的,比如给定b,就有b == a,c == b,d == c,.......,a == z. 问最长回文串所在区间,以及最长回文串所表示的明码. 解题思路: 字符串长度[1,200000],用manacher算法很轻松就搞定了. get√新技能请点击me 1 #include <cstdio> 2 #include <cstring> 3 #includ

[manacher] hdu 3294 Girls&#39; research

题意: 给一个字符x代表真实的a 然后输出的时候转换 然后就是求最长回文子串的串是什么 长度要大于1 思路: 就是裸的manacher,弄清楚下标的转换关系就好了 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #inc

HDU 3294 Girls&#39; research

题目地址 manacher 1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int Nmax=200005; 6 char s[Nmax]; 7 char str[Nmax*2+10]; 8 int p[Nmax*2+10]; 9 int hashh[Nmax*2+10]; 10 int id; 11 int maxlen; 12 i

[manacher] hdu 3294 Girls&amp;#39; research

题意: 给一个字符x代表真实的a 然后输出的时候转换 然后就是求最长回文子串的串是什么 长度要大于1 思路: 就是裸的manacher,弄清楚下标的转换关系就好了 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #inc

Girls&#39; research(manacher)

Girls' research Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1160    Accepted Submission(s): 448 Problem Description One day, sailormoon girls are so delighted that they intend to research a

【hdu3294】Girls&#39; research——manacher

Problem Description One day, sailormoon girls are so delighted that they intend to research about palindromic strings. Operation contains two steps: First step: girls will write a long string (only contains lower case) on the paper. For example, "abc

HDU 3616 Best Reward (Manacher算法 前缀回文+后缀回文)

Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 785    Accepted Submission(s): 338 Problem Description After an uphill battle, General Li won a great victory. Now the head of state

【转载】Manacher算法

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

(回文串 Manacher )Girls&#39; research -- hdu -- 3294

http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3294 Description One day, sailormoon girls are so delighted that they intend to res