hdu4513_吉哥系列故事——完美队形II

题目链接:点我

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 100009
int t[N<<1],p[N<<1];
int manacher(int n)
{
    int i,id=0,mx=0,ans=0;
    for(i=1; i<=n; i++)
    {
        if(mx>i) p[i]=min(mx-i,p[2*id-i]);
        else p[i]=1;
        while(t[i+p[i]]==t[i-p[i]]&&t[i-p[i]]<=t[i-p[i]+2]) p[i]++;//就在这一处地方加了条件判断。
        if(mx<i+p[i])
            mx=i+p[i],id=i;
        ans=max(ans,p[i]);
    }
    return ans-1;
}
int main()
{
    int tt,n,i;
    cin>>tt;
    while(tt--)
    {
        cin>>n;
        t[0]=-1,t[1]=0;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&t[2*i]);
            t[2*i+1]=0;
        }
        printf("%d\n",manacher(2*n+1));
    }
}

需要注意的是此题前半部分回文串是不降低排列,所以t[0]要比插入的元素(t[1],t[3],t[5],,,)要小

如果是 0,-1,51,-1,52,-1,51,-1那么就会出现t[0]也会匹配的现象,所以要让t[0]最小


写法2:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 100009
int t[N];
int main()
{
    int tt,n,i;
    cin>>tt;
    while(tt--)
    {
        cin>>n;
        t[0]=-1;//如果不写这句会默认t[0]=0,一直前后延伸下去
        for(i=1; i<=n; i++)
        {
            scanf("%d",&t[i]);
        }
        int s,e,ans=0;
        for(i=1; i<=n; i++)
        {
            s=i,e=i;
            while(t[s]==t[e+1])e++;
            i=e;
            while(t[s-1]==t[e+1]&&t[s-1]<=t[s]) s--,e++;
            ans=max(ans,e-s+1);
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值