【无聊放个模板系列】HDU 3068 MANACHER
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 110010 10 11 char s[Maxn]; 12 int l; 13 int a[Maxn*2],al,p[Maxn*2]; 14 15 int mymin(int x,int y) {return x<y?x:y;} 16 int mymax(int x,int y) {return x>y?x:y;} 17 18 void manacher() 19 { 20 int mx=0,id=0; 21 for(int i=1;i<=al;i++) 22 { 23 int k; 24 if(i<mx) k=mymin(p[2*id-i],mx-i+1); 25 else k=1; 26 while(a[i+k]==a[i-k]&&i-k>=1&&i+k<=al) k++; 27 p[i]=k; 28 if(i+p[i]-1>mx) mx=i+p[i]-1,id=i; 29 } 30 } 31 32 int main() 33 { 34 while(scanf("%s",s+1)!=EOF) 35 { 36 l=strlen(s+1); 37 al=0; 38 for(int i=1;i<=l;i++) a[++al]=30,a[++al]=s[i]-'a'+1; 39 a[++al]=30;a[++al]=31; 40 manacher(); 41 int mx=0; 42 for(int i=1;i<=al;i++) mx=mymax(mx,p[i]-1); 43 printf("%d\n",mx); 44 } 45 return 0; 46 }
马拉车