hdu-3294(最長回文子串)
阿新 • • 發佈:2018-08-11
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(最長回文子串)