题意:给你一个字符和一个字符串让你求出最长回文子串并且输出来,答案需要根据给出的字符转换一下,就是将给出的字符认定为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"); } } }