poj3974 Palindrome,回文串,Manacher

最近在暴搞字符串。

poj3974 Palindrome。
数据有点变态的大,10^6,dc3MLE,rmqTLE。

所以Manacher算法O(n)空间和时间求解回文串长还是很有用的嘛。

贴个模板。来自交大书,不用预处理加什么‘#’的,比较方便。记得len[]要开两倍字符串长。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Maxn 2001000

char s[Maxn];
int len[Maxn];

int manacher(char str[],int len[],int n){
    len[0]=1;
    int i,j,p,q,r;
    for(i=1,j=0;i<(n<<1)-1;++i){
        p=i>>1;q=i-p;r=((j+1)>>1)+len[j]-1;
        len[i]=r<q?0:min(r-q+1,len[(j<<1)-i]);
        while(p>len[i]-1&&q+len[i]<n&&str[p-len[i]]==str[q+len[i]])
            ++len[i];
        if (q+len[i]-1>r) j=i;
    }
    int ret=0,tmp;
    for(i=0;i<(n<<1)-1;++i){
        if (i&1) tmp=len[i]<<1;
        else tmp=(len[i]<<1)-1;
        if (tmp>ret) ret=tmp;
    }
    return ret;
}
int main(){
    int cas=0;
    int ol,tmp,ma,l,i;
    while(1){
        scanf("%s",s);     
        if (strcmp(s,"END")==0) break;
        l=strlen(s);
        ma=manacher(s,len,l);
        printf("Case %d: %d\n",++cas,ma);
    }
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值