hdu-3294(最长回文子串)

Posted huangdao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-3294(最长回文子串)相关的知识,希望对你有一定的参考价值。

题意:给你一个字符和一个字符串让你求出最长回文子串并且输出来,答案需要根据给出的字符转换一下,就是将给出的字符认定为a,然后依次向后推;

解题思路:manacher模板+一些处理

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<Cstdio>
using namespace std;
char s[200500],a[400500];
char t[30],m;
int p[400500];
int n;
int pos;
int change()
{
    int i,j,t;
    a[0]=‘$‘;
    a[1]=‘#‘;
    j=2;
    for(i=0;i<n;i++)
    {
        a[j++]=s[i];
        a[j++]=‘#‘;
    }
    a[j]=‘‘;
    return j;
}
int manacher()
{
    int len=change();
    int maxlen=-1;
    int id;
    int mx=0;
    for(int i=1;i<len;i++)
    {
        if(i<mx)
            p[i]=min(p[id*2-i],mx-i);
        else
            p[i]=1;
        while(a[i-p[i]]==a[i+p[i]])
            p[i]++;
        if(mx<p[i]+i)
        {
            mx=p[i]+i;
            id=i;
        }
        if(maxlen<p[i]-1)
        {
            maxlen=p[i]-1;
            pos=i;
        }
    }
    return maxlen;
}
int main()
{
    int x,y;
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    t[0]=‘z‘;t[1]=‘a‘;
    for(int i=2;i<=25;i++)
        t[i]=t[i-1]+1;
    while(scanf("%c %s",&m,s)!=EOF)
    {
        getchar();
        n=strlen(s);
        int ans=manacher();
        x=(pos-ans+1)/2-1;y=(ans+pos-1)/2-1;
        if(ans<=1)
        {
            printf("No solution!
");
        }
        else
        {
            printf("%d %d
",x,y);
            for(int i=x;i<=y;i++)
            {
                int xx=s[i]-m;
                xx++;
                xx=xx+26;xx=xx%26;
                printf("%c",t[xx]);
            }
            printf("
");
        }
    }
}

  

以上是关于hdu-3294(最长回文子串)的主要内容,如果未能解决你的问题,请参考以下文章

[manacher] hdu 3294 Girls&#39; research

Girls' research HDU - 3294(马拉车水题)

《算法竞赛入门经典》3.3最长回文子串

华为机试题 HJ85最长回文子串

华为机试题 HJ85最长回文子串

最长回文字串暴力