马拉车算法(回文子串长度)

#include<bits/stdc++.h>

using namespace std;

#define int long long

const int Max=100000;

char s[Max*2+5];

char str[Max*2+5];

int dp[Max*2+5];

void mc()

{

int n=strlen(s+1);

str[0]='s';

int j=1;

for(int i=1;i<=n;i++)

{

str[j++]='#';

str[j++]=s[i];

}

str[j++]='#';

str[j++]='@';

int pos=0,right=0;

for(int i=0;i<j;i++)

{

if(i<right)

{

dp[i]=min(dp[2*pos-i],right-i);

}

else

{

dp[i]=1;

}

while(str[i+dp[i]]==str[i-dp[i]])dp[i]++;

if(dp[i]+i>right)

{

right=dp[i]+i;

pos=i;

}

}

int mx=0;

for(int i=0;i<j;i++)

{

mx=max(dp[i]-1,mx);

}

cout<<mx<<endl;

}

signed main()

{

scanf("%s",s+1);

mc();

return 0;

}

posted @   夜深人静写算法  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示