HDU3068[最长回文]--Manacher

【链接】
hdu3068

【题目大意】
Manacher模板裸题。

【解题报告】
Manacher模板裸题。

#include<cstdio>
#include<cstring>
#define min(x,y) (x)<(y)?(x):(y)
#define max(x,y) (x)>(y)?(x):(y)
using namespace std;
const int maxn=110005,maxm=220005;
int p[maxm];
char s[maxn],c[maxm];
bool Sread(char *s)
{
    char ch=getchar(); int len=1;
    while (ch<'a'||ch>'z') {if (ch==EOF) return 0; ch=getchar();}
    while (ch>='a'&&ch<='z') s[len++]=ch,ch=getchar(); s[len]='\0';
    return 1;
}
int Manacher(char *s)
{
    int len=strlen(s+1);
    for (int i=1; i<=len; i++) c[2*i-1]='~',c[2*i]=s[i]; c[len=2*len+1]='~';
    int Pos=0,R=0,MAX=0;
    for (int i=1; i<=len; i++)
    {
        if (i<R) p[i]=min(p[2*Pos-i],R-i); else p[i]=1;
        while (1<=i-p[i]&&i+p[i]<=len&&c[i-p[i]]==c[i+p[i]]) p[i]++;
        if (i+p[i]>R) {R=i+p[i]; Pos=i;}
        MAX=max(MAX,p[i]-1);
    }
    return MAX;
}
int main()
{
    freopen("3068.in","r",stdin);
    freopen("3068.out","w",stdout);
    while (Sread(s)) printf("%d\n",Manacher(s));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值