hdu-3294(最长回文子串)

时间:2023-03-09 08:34:36
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]='\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");
}
}
}