There's nothing left to say about this kind of naked question.
#include <stdio.h> #include <string.h> #include <iostream>using namespaceStd; Char Str[200010],Str1[400010]; int Mark[400010]; int Min (int A ,int B ) { return A<B?A:B;} int Main () { char str2[5]; int I,J; while (~scanf("%s%s",str2,Str) ) { int Len=Strlen(Str);Str1[0]=' $ ';J=0; for (I=0;I<Len;I++) {Str1[++J]=' # '; if (Str[I]>=str2[0])Str[I]=Str[I]-str2[0]+' A '; Else Str[I]= --(str2[0]-Str[I])+' A ';Str1[++J]=Str[I]; }Str1[++J]=' # ';Memset(Mark,0 ,sizeof( Mark)); int Right=0,K=0,Id,Pp; for (I=0;I<=J;I + +) { if( Right<=I)Mark[I]=1; Else Mark[I]=Min(Mark[2*Id-I],Right-I); while (Str1[I+Mark[I]]==Str1[I-Mark[I]])Mark[I]++; if (Right<I+Mark[I]) {Right=I+Mark[I];Id=I; } if( Mark[I]>K) {K=Mark[I];Pp=I; } }K-=1; if (K<=1)Printf("No solution!\n"); Else { if( Str1[Pp]!=' # ')Printf("%d%d\n",Pp/2-(K-1)/2-1,Pp/2+(K-1)/2-1); Else Printf("%d%d\n",(Pp-1)/2-(K-1)/2-1,(Pp+1)/2+(K-1)/2-1); for (I=Pp-K+1;I<Pp+K;I+=2) {Printf("%c",Str1[I]); }Printf("\ n"); }} return 0;}
HDU 3294 Manacher algorithm