当前位置: 首页 > news >正文

[Manacher]【学习笔记】

终于填坑啦......马拉车


 

课件上说的好短,但是明白了,讲解稍微修改一下抄上行了,比扩展KMP好写多了

求以每个字符为中心的最长回文串的半径。
如果要求可以以字符间隙为回文中心,就要在每两个字符之间及两端加入一个’#’,然后再解决。
令r[i]为以i为中心的最长回文半径。从左往右依次求r数组。
当前要求r[i],曾经的j+r[j]-1最大是p,对应的下标为a。如果r[2*a-i]+i-1<p,r[i]=r[2*a-i];否则r[i]≥p-i+1,暴力向后扩展。

2*a-i就是i关于a的对称位置,上面那句很显然啊<p的时候就被包括在a为中心的回文串里呀

实现上,直接r[i]=i<p?min(p-i+1,r[2*a-i]):1,然后往两边扩展就行了

 

模板题:HDU3068

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2e6+5;
int n;
char s[N],a[N];
int r[N];
void Manacher(char s[],int n){
    int p=0,a,ans=0;
    for(int i=1;i<=n;i++){
        r[i]=i<p?min(p-i+1,r[2*a-i]):1;
        while(s[i-r[i]]==s[i+r[i]]) r[i]++;
        if(i+r[i]-1>p) p=i+r[i]-1,a=i;
        ans=max(ans,r[i]);
    }
    printf("%d\n",ans-1);
    //for(int i=1;i<=n;i++) printf("%d ",r[i]);puts("\n");
}
void iniStr(char s[]){
    for(int i=1;i<=n;i++)
        a[(i<<1)-1]='#',a[i<<1]=s[i];
    a[(n<<1)+1]='#';
    a[0]='@';a[(n<<1)+2]='$';
}
int main(){
    freopen("in","r",stdin);
    while(scanf("%s",s+1)!=EOF){
        n=strlen(s+1);
        iniStr(s);
        Manacher(a,n<<1|1);
    }
}

 

相关文章:

  • python 常见问题总结
  • http通信json解析过滤无关字符
  • kalilinux、parrotsecos没有声音
  • Git 使用集
  • CentOS修改时区、日期、时间
  • ntdsutil 清理弃用服务器-----待验证
  • 无线通信基础资料总结1 之 GSM
  • SPOJ Highways [矩阵树定理]
  • ​插件化DPI在商用WIFI中的价值
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Xcode8 打包ios app,上传APPStore,发布流程 以及证书和配置文件遇到的坑
  • 数据结构与算法 第四次实验报告 图
  • php 验证邮箱的方法
  • centos7 修改默认字符集
  • mybatis的动态sql中collection与assoction
  • 【Linux系统编程】快速查找errno错误码信息
  • Docker下部署自己的LNMP工作环境
  • HTML-表单
  • leetcode讲解--894. All Possible Full Binary Trees
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python大佬养成计划----difflib模块
  • React as a UI Runtime(五、列表)
  • Zepto.js源码学习之二
  • 成为一名优秀的Developer的书单
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 浏览器缓存机制分析
  • 我建了一个叫Hello World的项目
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 自制字幕遮挡器
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2)STM32单片机上位机
  • (2.2w字)前端单元测试之Jest详解篇
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (补)B+树一些思想
  • (九)c52学习之旅-定时器
  • (一)appium-desktop定位元素原理
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)大型网站的系统架构
  • (转载)Linux 多线程条件变量同步
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • **python多态
  • ... 是什么 ?... 有什么用处?
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net中wcf服务生成及调用
  • .NET中的Exception处理(C#)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .pop ----remove 删除
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48