马拉车(求最长回文字串长度)

核心: 同 扩宽KMP, 利用已知信息阴影来 进行更新. 

思路:

  • 利用已知的东西来跳过,从而优化时间复杂度
  • 首先预处理 每一个字符2边加上'#',开头加上'$', 任意没有在字符串中出现过的,
  • 2个关键因素 mid,和p[],半径和 目前最大的 R
  • 如果i<r,那么久可以来优化时间复杂度, 更具对称性
  • 然后在暴力判断
#include <bits/stdc++.h>
using namespace std;
#define ri register int 
#define M 41000007

int n,m;
string bbb;
string s;
int p[M];int ans=0;
void manacher()
{
    s="$#";
    for(ri i=0;i<bbb.length();i++)
    {
        s+=bbb[i];
        s+="#";
    }
    
    int r=0,mid=0;
    for(ri i=1;i<s.length();i++)
    {
        if(i<r)
        {
            p[i]=min(p[mid*2-i],r-i+1);
        }
        while(s[i-p[i]]==s[i+p[i]]) p[i]++;
        if(p[i]+i>r) r=p[i]+i-1,mid=i;
        ans=max(p[i],ans);
    }
}
int main(){
    
    cin>>bbb;
    manacher();
    
    cout<<ans-1;
    
}
View Code

后记:

  • 初始位置: (i-p[i])/2;

 

模板题:

P3805 【模板】manacher 算法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2022-07-13 10:44  VxiaohuanV  阅读(29)  评论(0编辑  收藏  举报