Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2274    Accepted Submission(s): 795
 
 
 
1 10 2 3 4 4 3 2 2 3 4 4
 
Case #1: 9
 
 
 
关于manacher算法,链接:>>manacher<<
转载请注明出处:寻找&星空の孩子
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5371
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100010*2
const int mm=1e9+7;
int P[maxn];
//(p.s. 能够看出。P[i]-1正好是原字符串中回文串的总长度)
int s1[maxn];
int s2[maxn];
int n;
int min( int x, int y )//Wa,没加这个。。。
{
    return x < y ? x : y;
}
void manacher(int* s)
{
    int i,id=0,mx=0;
    P[0]=0;
    for(i=1;i<=2*n+1;i++)
    {
        if(mx > i)
            P[i] = min(P[2*id-i],mx-i);
        else
            P[i] = 1;
        while(s[i+P[i]]==s[i-P[i]] )
        {
            P[i]++;
        }
        if(mx < P[i] + i)
        {
            mx = P[i] + i;
            id = i;
        }
    }
}
void init(int n)
{
    int i, j = 2;
    s2[0] =-1, s2[1] = -2;
    for(i=0;i<n;i++)
    {
        s2[j++] = s1[i];
        s2[j++] = -2;
    }
    s2[j]=-3;
}
int main()
{
 //   printf("%d\n",mm);
    int T,ca=1;
    scanf("%d",&T);
    while(ca<=T)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%d",&s1[i]);
        init(n);
        manacher(s2);
        int ans=0;
        for(int i=1;i<=2*n+1;i+=2)
        {
 //           printf("i=%d\tP=%d\n",i,P[i]);
                for(int j=P[i]+i-1;j-i>ans;j-=2)
                {
                    if(j-i+1<=P[j])
                    {
                        ans=max(ans,j-i);
                        break;//坑
                    }
                }
        }
        printf("Case #%d: %d\n",ca++,ans/2*3);
    }
    return 0;
}
/*
2
10
2 3 4 4 3 2 2 3 4 4
7
1 2 3 2 1 2 3
*/
 
Hotaru's problem(hdu5371+Manacher)多校7
原文:http://www.cnblogs.com/brucemengbm/p/7341293.html