1. 程式人生 > >hdu-3294(最長回文子串)

hdu-3294(最長回文子串)

pre har solution mes pos 最長 chan ret 最長回文子串

題意:給你一個字符和一個字符串讓你求出最長回文子串並且輸出來,答案需要根據給出的字符轉換一下,就是將給出的字符認定為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]=‘\0‘;
    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!\n");
        }
        else
        {
            printf("%d %d\n",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("\n");
        }
    }
}

  

hdu-3294(最長回文子串)