Manacher - Girls' research(HDU 3294)
阿新 • • 發佈:2018-12-30
Analysis
難受,
1.陣列開小,在家裡對拍了好久,結果造的資料恰好是上限的一半,然後就不會RE。。。(manacher的陣列大小需要在原數的大小上*2)
2.要求是長度>=2,注意可以取等
3.當i<mx時,
,不要手賤,打成了
唉,敲個模板而已,人生為何如此困難
但這道題還是蠻簡單的,就是求出最長迴文子串的中心及其長度,然後轉化一下即可
Code
#include<bits/stdc++.h>
#define N 200009
using namespace std;
char st[N],rep,idx[30];
char stn[N<<1];
int Len,maxn=-1,id,p[N<<1],mx,ans;
inline void change(char ch){
int std=ch-'a';
for(int i=0;i<26;++i)
idx[i]=(i-std+26)%26+'a';
}
inline int prework(int len){
int j=1;
stn[0]='$';
stn[1]='#';
for(int i=0;i<len;++i)
{
stn[++j]=st[i];
stn[++j]='#';
}
stn[j+1]='\0';//有效位置1~j
return j;
}
inline void manacher(){
id=0;mx=0;memset(p,0,sizeof(p));
for(int i=1;i<=Len;++i){
if(i<mx) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(stn[i-p[i]]==stn[i+p[i]]) p[i]++;
if(i+p[i]>mx){
id=i;
mx=i+p[i];
}
if(maxn<p[i]-1){
maxn=p[i]-1;
ans=i;
}
}
}
int main(){
while(scanf("%c%s",&rep,st)!=EOF)
{
getchar();
maxn=-1;
change(rep);
Len=prework(strlen(st));
manacher();
if(maxn>=2){
int r=ans+maxn-1,l=ans-maxn+1;
int ll=l/2-1,rr=r/2-1;
printf("%d %d\n",ll,rr);
for(int i=ll;i<=rr;++i) printf("%c",idx[st[i]-'a']);
printf("\n");
}
else printf("No solution!\n");
}
return 0;
}