manacher算法模板

内存较大的:

#include <iostream>  
#include <algorithm>  
#include <cstdio>  
#include <cstring>  
#include <string>  
using namespace std;  
#define inf 310010  
char s[inf], str[inf];  
int p[inf], len;  
void gets()  
{  
    int li = strlen(str);  
    len = 0;  
    s[len++] = '&';  
    s[len++] = '#';  
    for(int i=0; i<li; i++)  
    {  
        s[len++] = str[i];  
        s[len++] = '#';  
    }  
}  
void getp()  
{  
    gets();  
    memset(p, 0, sizeof(p));  
    int id = 0, mx = 0;  
    for(int i=1; i<len; i++)  
    {  
        int j = 2*id-i;  
        p[i] = mx>i ? min(p[j], mx-i):1;  
        while(s[i+p[i]] == s[i-p[i]]) p[i]++;  
        if(i+p[i] > mx)  
        {  
            mx = i+p[i];  
            id = i;  
        }  
    }  
}  
int main()  
{  
    while(~scanf("%s", str))  
    {  
        getp();  
        int ans=1;  
        for(int i=0; i<len; i++) ans = max(ans, p[i]-1);  
        printf("%d\n", ans);  
    }  
    return 0;  
}   


内存较小的:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2000010;
int n;
char s[N];
int d1[N], d2[N];
//d1[]记录的是奇数,d2[]记录的是偶数 
int main() {
    scanf("%d", &n);
    scanf("%s", s);
    for (int i = 0, l = 0, r = -1; i < n; ++i) {
        d1[i] = (i <= r ? min(d1[l + r - i], r - i + 1) : 1);
        while (i - d1[i] >= 0 && i + d1[i] < n && s[i - d1[i]] == s[i + d1[i]]) ++d1[i];
        if (i + d1[i] - 1 > r) l = i - d1[i] + 1, r = i + d1[i] - 1;
    }
    for (int i = 1, l = 0, r = -1; i < n; ++i) {
        d2[i] = (i <= r ? min(d2[l + r - i + 1], r - i + 1) : 0);
        while (i + d2[i] < n && i - d2[i] - 1 >= 0 && s[i + d2[i]] == s[i - d2[i] - 1]) ++d2[i];
        if (d2[i] > 0 && i + d2[i] - 1 > r) l = i - d2[i], r = i + d2[i] - 1;
    }
    int ans = 0;
    for(int i = 0; i < n; i++) {
    	cout<<i<<" "<<d1[i]<<" "<<d2[i]<<endl;
    	ans = max(ans, max(d1[i]*2-1, d2[i]*2));
    }
    printf("%d\n", ans);
    return 0;
}
/*
9
abcbaccab
0 1 0
1 1 0
2 3 0
3 1 0
4 1 0
5 1 0
6 1 3
7 1 0
8 1 0
6
*/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值