码迷,mamicode.com
首页 > 编程语言 > 详细

洛谷.3805.[模板]manacher算法

时间:2018-03-30 19:54:18      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:中心   log   gpo   cstring   ble   cst   org   source   mat   

题目链接

之前做很早了没写这篇,补上。

记录当前ex[]最大的回文中心id和最远延伸范围mx!
关于串的构造:
应该是 @ #A#B#C#B#A# $ ,而不是 @ A#B#C#B#A $
比如 @a#b#b#c$,答案应是\(max\{ex[i]\}-1\),而第二种很多情况下答案是\(max\{ex[i]\}\).

最优解不改串分奇偶讨论感觉sxbk。。其实也没什么

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=22000010;

int n,ex[N];
char tmp[N>>1],s[N];

void Init()
{
    n=strlen(tmp), s[0]='@';
    for(int i=0; i<n; ++i)
        s[i<<1|1]='#', s[(i<<1)+2]=tmp[i];
    s[n=2*n+2]='$', s[n-1]='#';
}
void Manacher()
{
    int res=0,mx=0,id;
    for(int i=1; i<n; ++i)
    {
        if(i<mx) ex[i]=std::min(ex[id*2-i],mx-i);
        else ex[i]=1;
        while(s[i+ex[i]]==s[i-ex[i]]) ++ex[i];
//      if(ex[i]>res) res=ex[i];//不在这更新也是对的,懒得具体想了。。
        if(i+ex[i]>mx) id=i,mx=i+ex[i],res=std::max(res,ex[i]);
    }
    printf("%d",res-1);
}

int main()
{
    scanf("%s",tmp), Init(), Manacher();
    return 0;
}

洛谷.3805.[模板]manacher算法

标签:中心   log   gpo   cstring   ble   cst   org   source   mat   

原文地址:https://www.cnblogs.com/SovietPower/p/8677979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!