首页 > 其他分享 >Manacher学习笔记

Manacher学习笔记

时间:2023-10-08 20:56:42浏览次数:37  
标签:子串 int Manacher 笔记 学习 maxn include 最远 回文

1.介绍:

manacher算法用于求解回文子串问题,可以求出以一个串中每一点为中心的最长回文半径,相当于可以求出所有回文子串

2.引入:

假如要求出一个串所有长度为奇数的回文子串,暴力怎么做?
枚举以每个点为回文中心,向两侧扩展,分别比较a[p+i]与a[p-i]
时间复杂度 O(n^2)


我们考虑优化,我们可以利用已经求解出的回文子串的信息

  • 举例:a a b c b a b c

考虑回文中心在i之前的、最右端最远的一个回文子串

可以看出,在求解第7位b的回文半径时,我们是可以利用到第3位b的数据的

  • 当然,有的时候需要注意一下

此时就要注意,不能直接利用3,而是要与最远的那个回文子串进行一个比较

因此,我们只需要记下来当前右端最远的回文子串,就可以先利用之前的信息跳过一部分试验

当然,在利用过后,还需要继续用暴力的方法拓展

对了,现在只求出了所有长度为奇数的回文子串,那么长度为偶数的怎么办?

在每两个字符之间插入特殊字符即可

例如aabbaa -> #a#a#b#b#a#a#

Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 11000010
int cnt; 
int len;
char s[maxn],s_[maxn*2];
int f[maxn*2];
void make()
{
	cnt=2;
	s_[0]='^';
	s_[1]='$';
	for(int i=0;i<len;i++)
	{
		s_[cnt++]=s[i];
		s_[cnt++]='$';
	}
	s[cnt]='&';
}//世界第一甜
void Manacher()
{
	int mid=0,ans=0,ma=0;
	for(int i=1;i<=(len*2+1);i++)
	{
		if(ma>i)
		{
			f[i]=min(ma-i,f[mid*2-i]);
		}
		else
		{
			f[i]=1;
		}
		while(s_[i-f[i]]==s_[i+f[i]])
		{
			f[i]++;
		}
		if(ma<(i+f[i]))
		{
			ma=i+f[i]; 
			mid=i;
		}
		ans=max(ans,f[i]);
	}
	printf("%d\n",ans-1);
	return;
}//华锐李泽言
int main()
{
	scanf("%s",s);
    len=strlen(s);
	make();
	Manacher();
	return 0;
} 

标签:子串,int,Manacher,笔记,学习,maxn,include,最远,回文
From: https://www.cnblogs.com/Amy28/p/17750108.html

相关文章

  • linux学习记录 10.8
    acterminal分配了如下信息:(1)user用户名  (2)hostnameip地址(3)password密码homework4getinfo查看上述信息 知识点:1、ssh登录到某个自己的服务器sshuser@hostname=登录服务器 exit/logout/ctrl+d=退出退出后进入.ssh看到一个known_hosts就会记录刚......
  • Redis笔记
    redis数据类型字符串(String):存储单个值。用例:存储文本、数字、计数器等。SETusername"john_doe"GETusername列表(List):有序集合,允许重复元素。用例:消息队列、新闻推送、日志记录等。LPUSHtasks"task1"LPUSHtasks"task2"LRANGEtasks0-1LREM:LREM命令用于从......
  • 2023-2024-1 20231303 赵泊瑄《计算机基础与程序设计》第二周学习总结
    2023-2024-1学号20231303《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程如2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接如2023-2024-1计算机基础与程序设计第周作业)这个作业的目标总结第二周学习收获作业正文......
  • iaas运维笔记记录
    iaas运维笔记记录镜像创建source/etc/keystone/admin-openrc.sh(挂载用户配置文件)glanceimage-create--name"cirros"--disk-formatqcow2--container-formatbare<cirros-0.5.2-x86_64-disk.qcow2--name:创建后的镜像名称--disk-format:镜像格式--contrainer-form......
  • Markdown语法学习
    Markdown学习标题字体hello,worldhello,worldhello,wordhello,word引用狂神说列表abc12表格名字性别生日张三男1983.4.5代码hellopublic......
  • 学习小结(10.2~10.8)
    “在还有未来的过去渴望着美好结局”——草东没有派对《山海》学习记录日期10.210.310.4内容考试考试考试收获又是dp、期望qwq李超线段树加急!!!T_T经典不会T3、T4,T2莫队还没对,T1构造错了反思T2DP没推出来合适的状态和方程T3又是期望制裁昨天刚准备......
  • java学习
    ......
  • 2023-2024-1 20231325 《计算机基础与程序设计》第二周学习总结
    目录作业信息教材学习内容总结1.《计算机科学概论》第一章1)计算系统;2)计算系统的分层;3)抽象;《c语言程序设计》第一章学习编程的原因,了解编程及编程的学习。gcc测试作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业的......
  • 学习笔记421—Win7下使用U盘安装linux Ubuntu16.04双系统图文教程
    Win7下使用U盘安装linuxUbuntu16.04双系统图文教程安装步骤:1、下载Ubuntu16.04镜像软件;2、使用ultraISO软件制作U盘启动盘;3、利用U盘启动盘来安装Ubuntu系统;4、使用EasyBCD创建启动系统启动引导;5、重启系统即可。Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源G......
  • Android 定时器简单使用及学习
    本文,介绍常用定时器实现方式:1)Handler+Sleep方式2)Handler+PostDelayed方式3)Handler+Timer方式Handler的主要作用就是用来处理接收到的信息,用Handler消息传递机制是为了多个线程并发更新U的同时,保证线程安全1)Handler+Sleep方式1.1)Handler+Sleep定义publicclassHandlerAn......