bzoj2565: 最长双回文串

本文详细介绍了一种使用马拉车算法解决字符串匹配问题的方法。通过具体的代码实现展示了如何利用该算法找到字符串中的最长回文子串,并提供了完整的C++代码示例。

这题裸题马拉车,跑完以后,找井就可以了。

  
#include<cstdio> 
#include<iostream> 
#include<cstring> 
#include<cstdlib> 
#include<algorithm> 
#include<cmath> 
using namespace std; 
  
int p[210000],l[210000],r[210000]; 
char sc[110000],ss[210000]; 
int main() 
{ 
    scanf("%s",sc+1);int len=strlen(sc+1); 
    for(int i=1;i<=len;i++) 
        ss[2*i-1]='#', ss[2*i]=sc[i]; 
    ss[2*len+1]='#';len=2*len+1; 
      
    int k=0;p[k]=0; 
    for(int i=1;i<=len;i++) 
    { 
        int Lk=k-p[k]+1,Rk=k+p[k]-1; 
        int j=k-(i-k); 
          
        if(Lk<=j)p[i]=min(p[j],j-Lk+1); 
        else p[i]=0; 
          
        while(ss[i+p[i]]==ss[i-p[i]]&&i-p[i]>0&&i+p[i]<=len)p[i]++; 
        if(i+p[i]-1>Rk)k=i; 
    } 
      
    int mx=1; 
    for(int i=1;i<=len;i++) 
        while(mx<=i+p[i])l[mx++]=i; 
    mx=len; 
    for(int i=len;i>=1;i--) 
        while(mx>=i-p[i])r[mx--]=i; 
      
    int ans=0; 
    for(int i=1;i<=len;i++) 
        if(ss[i]=='#')ans=max(ans,(i-l[i])*2+(r[i]-i)*2+1); 
    printf("%d\n",ans/2); 
    return 0; 
} 

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8341888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值