HDU 3068 最长回文 【manacher模版】

题目链接

题目大意:求最长回文


思路:manacher 模版


WA:写成了n*n的复杂度了


AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 110010

using namespace std;

int manacher(char a[],int n)
{
    int ans = 0;
    int mx = 0;
    int p = 0;
    int r[2*N];
    memset(r,0,sizeof r);
    for(int i = 1; i <= n; i++)
    {
        if(i < mx)
            r[i] = min(r[2*p - i], mx-i);
        else
            r[i] = 1;
        while(a[i-r[i]] == a[i+r[i]])
            r[i]++;
        if(i+r[i] > mx)
        {
            p = i;
            mx = r[i]+i;
        }

        ans = max(ans,r[i]);
    }
    return ans-1;
}

int main()
{
    char ch[N],st[2*N];
    while(~scanf("%s", ch))
    {
        int n = strlen(ch);
        st[0] = 'S';
        st[1] = '#';
        st[2*n+2] = '\0';
        for(int i = 1; i <= n; i++)
        {
            st[2*i+1] = '#';
            st[2*i] = ch[i-1];
        }
        printf("%d\n",manacher(st,2*n+1));
    }
}


超时代码:


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 110010

using namespace std;

int manacher(char a[],int n)
{
    int ans = 0;
    int mx = 0;
    int r[2*N];
    memset(r,0,sizeof r);
    for(int i = 1; i <= n; i++)
    {
        if(i < mx)
            r[i] = min(r[2*mx - i], mx-i);//这里应该是min(r[2*p-i],mx-i)
        else
            r[i] = 1;
        while(a[i-r[i]] == a[i+r[i]])
            r[i]++;
        if(i+r[i] > mx)
            mx = r[i]+i;
        ans = max(ans,r[i]);
    }
    return ans-1;
}

int main()
{
    char ch[N],st[2*N];
    while(~scanf(" %s", ch))
    {
        int n = strlen(ch);
        st[0] = 'S';
        st[1] = '#';
        st[2*n+2] = '\0';
        for(int i = 1; i <= n; i++)
        {
            st[2*i+1] = '#';
            st[2*i] = ch[i-1];
        }
        printf("%d\n",manacher(st,2*n+1));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值