Manacher算法

用来算回文串的回文半径
原理看这里:
原理
下面直接上模板

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 11000002;
char s[N << 1];
int r[N << 1],cnt;
void read(){//预处理字符串,将字符串长度处理成2n + 1
    char c = getchar();
    cnt = 1;
    s[0] = '~';s[1] = '|';
    while(c < 'a' || c > 'z') c= getchar();
    while(c >= 'a' && c <= 'z') s[++ cnt] = c,s[++ cnt] = '|',c = getchar();
}
int main(){
    read();
    int rb = 0,mid = 0;
    for(int i = 1;i <= cnt;i++){//计算回文半径r[],答案是r[](max) - 1
        if(i <= rb) r[i] = min(r[(mid << 1) - i],rb - i + 1);
        while(s[i - r[i]] == s[i + r[i]]) r[i] ++;
        if(r[i] + i > rb) rb = r[i] + i - 1,mid = i;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值