如图,最短的回文串长就是:改字符串的最长回文后缀长度+余下的长度*2
int n,len[MX<<1];
char a[MX],s[MX<<1];
int Manacher(int tt)
{
int mr=0,pos=0,mx=1;//最长的到达右端的回文串
rpp(i,tt)
{
len[i]=i<mr?min(mr-i,len[pos*2-i]):1;
while(s[i+len[i]]==s[i-len[i]]) ++len[i];
if(i+len[i]>mr) mr=i+len[i],pos=i;
if(i+len[i]>=tt) mx=max(mx,len[i]-1);
}
return mx+(n-mx)*2;
}
signed main()
{
int T;cin>>T;
rpp(_,T)
{
scanf("%s",a+1);
n=strlen(a+1);
s[0]='@',s[n*2+2]=0;
rpp(i,n)
{
s[i*2]=a[i];
s[i*2-1]=s[i*2+1]='#';
}
printf("Case %d: %d\n",_,Manacher(n*2+1));
}
stop;
}