题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4513
可以参考回文串算法:http://blog.csdn.net/hearthougan/article/details/27174257
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 100010;
int MIN(int a, int b)
{
return a < b ? a : b;
}
void AddSpecialNum(int* arr, int* arr1, int n)
{
int i, j;
arr1[0] = 0;
arr1[1] = 1;
for(i = 0, j = 2; i < n; ++i, j += 2)
arr1[j] = arr[i], arr1[j+1] = 1;
arr1[j] = -1;
}
int FindMaxPalindrome(int* arr)
{
int iMax = 0, index = 0, mx = 0, i;
int p[MAXN*2];
memset(p, 0, sizeof(p));
for(i = 1; arr[i] != -1; ++i)
{
p[i] = mx > i ? MIN(p[2*index-i], mx-i) : 1;
while(arr[i-p[i]] == arr[i+p[i]])
{
if(arr[i-p[i]] == 1)
p[i]++;
else if(i+p[i]-2 < i || arr[i+p[i]] <= arr[i+p[i]-2])
p[i]++;
else break;
}
if(i+p[i] > mx)
mx = i + p[i], index = i;
if(iMax < p[i])
iMax = p[i];
}
return iMax - 1;
}
int main()
{
int T, n, i, arr[MAXN], arr1[MAXN];
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(i = 0; i < n; ++i)
scanf("%d", &arr[i]);
AddSpecialNum(arr, arr1, n);
int iMax = FindMaxPalindrome(arr1);
printf("%d\n", iMax);
}
return 0;
}