hdu 4513 吉哥系列故事——完美队形II(最大回文子串-manacher算法)

题意:求序列最大回文子串,且子串左侧必须单调非递增。

我就是看这道题需要O(n)的复杂度才能过,所以特意学习了一下manacher算法。

跟hdu3068一样,扫描的时候比较一下值的大小即可。

#include
#include
#define N 200010
int q_in[N],q[N],dp[N];
int mark,line;
int ans;
int min(int x,int y)
{
    if(xi?min(dp[mark*2-i],line-i):1;
            while(i-dp[i]>=0&&i+dp[i]<=n&&q[i+dp[i]]==q[i-dp[i]]&&q[i-dp[i]]<=q[i-dp[i]+2])
                dp[i]++;
            if(i+dp[i]>line)
            {
                line=i+dp[i];
                mark=i;
            }
            if(dp[i]>ans)
                ans=dp[i]-1;
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(动态规划,数据结构)