Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1544 Accepted Submission(s): 577
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define N 2000007 int s[N], S[N], p[N]; int Manacher(int len) { int MaxLen = 0, index = 0, ans = 0; for(int i=2; i<len; i++) { if(MaxLen>i) p[i] = min(p[index*2-i], MaxLen-i); else p[i] = 1; while(s[i-p[i]]==s[i+p[i]] && (s[i-p[i]]==-2 || p[i]==1 || s[i-p[i]]<=s[i-p[i]+2])) p[i]++; if(p[i]+i>MaxLen) { MaxLen = p[i] + i; index = i; } ans = max(ans, p[i]); } return ans-1; } int main() { int t; scanf("%d", &t); while(t--) { int n, i; scanf("%d", &n); s[0] = INF; for(i=0; i<n; i++) { scanf("%d", &S[i]); s[i*2+1] = -2; s[i*2+2] = S[i]; } s[i*2+1] = -2; s[i*2+2] = -INF; printf("%d\n", Manacher(n*2+1)); } return 0; }
(回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513
原文:http://www.cnblogs.com/YY56/p/4853576.html