#include<iostream> using namespace std; #define N 100010 int len[N<<1]; int a[N<<1]; int Manacher(int n) { int i,ans,mx,po; ans=po=mx=0; for(i=1;i<=(n<<1)+2;i++) { if(mx>i) len[i]=mx-i<len[(po<<1)-i]?mx-i:len[(po<<1)-i]; else len[i]=1; while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2]) //因为有填充字符'#',所以要+2。 len[i]++; if(i+len[i]>mx) { mx=i+len[i]; po=i; } ans=ans>len[i]?ans:len[i]; } return ans-1; } int main() { int T,n,i; scanf("%d",&T); while(T--) { scanf("%d",&n); a[0]=-100; for(i=1;i<=n<<1;i+=2) { a[i]=-200; //相当于'#' scanf("%d",&a[i+1]); } a[i]=-200; //相当于'#' a[i+1]=-300; printf("%d\n",Manacher(n)); } return 0; }
HDU ACM 4513 吉哥系列故事——完美队形II->求最长回文串(manacher算法)
原文地址:http://blog.csdn.net/a809146548/article/details/45506929