[SHOI2011]双倍回文 manacher

题面:

  洛谷:[SHOI2011]双倍回文‘

题解:

  首先有一个性质,本质不同的回文串最多O(n)个。

  所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间劈开后左边的一半是否也是一个回文串(判断左边那半的中点的回文半径是否可以跨过当前长串的中点)。

  复杂度O(n)

 1 // luogu-judger-enable-o2
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 #define R register int
 5 #define AC 1001000
 6 
 7 int n, pos, maxn, ans;
 8 int r[AC];
 9 char a[AC], s[AC];
10 
11 void pre(){
12     scanf("%d%s", &n, a + 1);
13     s[0] = '$', s[1] = '#';
14     for(R i = 1; i <= n; i ++) s[2 * i] = a[i], s[2 * i + 1] = '#';
15 }
16 
17 inline void upmax(int &a, int b){
18     if(b > a) a = b;
19 }
20 
21 void manacher()
22 {
23     int b = 2 * n;
24     for(R i = 1; i <= b; i ++)
25     {
26         r[i] = (maxn > i) ? min(r[2 * pos - i], maxn - i + 1) : 1;//这里要取min
27         while(s[i - r[i]] == s[i + r[i]]) ++ r[i];
28         
29         int last = i - r[i] + 1, Next = i + r[i] - 1;
30         if(s[last] == '#') ++ last, -- Next;
31         if(i + r[i] - 1 > maxn && last <= i)//last才是整个串的开头
32         {
33             for(R j = maxn + 1; j <= Next; j ++)
34             {
35                 int l = 2 * i - j;//获取串头
36                 int sum = (j - l + 1 + 1) >> 1;
37                 if(s[j] == '#' || sum % 4) continue;//中间是获取实际字符数
38                 int tmp = (l + j) >> 1, k = (tmp + l) >> 1;                
39                 if(k + r[k] - 1 >= tmp) upmax(ans, sum); 
40             }
41         }
42         
43         if(i + r[i] - 1 > maxn) pos = i, maxn = i + r[i] - 1;
44     }
45     printf("%d\n", ans);
46 }
47 
48 int main()
49 {
50     //freopen("in.in", "r", stdin);
51     pre();
52     manacher();
53     //fclose(stdin);
54     return 0;
55 }
View Code

 

转载于:https://www.cnblogs.com/ww3113306/p/10066792.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机操作员可以免考自考吗,计算机《职业资格证书》可以免考高

随着全国计算机等级考试(NCRE)的持续发展&#xff0c;NCRE的合格证书已被各行业广泛认可&#xff0c;部分省级自考办实行获得NCRE合格证书可免考高等教育自学考试相关课程的办法以拓展考试功效。为规范管理和保证课程免试的科学性&#xff0c;根据重庆市考办(渝考办发[200630]号…

服务器术语大全

1 服务器的1U 2U 含义 U是unit的缩写&#xff0c;表示服务器外部尺寸的单位&#xff0c;U规定服务器宽为&#xff08;48.26cm19英寸&#xff09;&#xff0c;高厚度为&#xff08;4.445cm&#xff09;U为基本单位&#xff0c;服务器大小必须为U 的倍数. 服务器常见专业术语大全…

python中出现ascii编码问题的解决办法

一劳永逸&#xff0c;一次性全盘解决的办法 环境变量中去设置 以centos 7为例&#xff1a; vim /etc/profile export PYTHONIOENCODINGutf-8 source /etc/profile 其它方法有&#xff1a; 代码头加&#xff1a; #coding:utf-8 等各种格式的声明 python2: import sys reload…

微信在计算机基础中的辅助作用,基于微信课后辅导在计算机基础教学中应用.doc...

基于微信课后辅导在计算机基础教学中应用基于微信课后辅导在计算机基础教学中应用摘 要&#xff1a; 如今&#xff0c;计算机技术更新快与计算机教育资源少的矛盾&#xff0c;促使课后学习成为大学生获取知识的重要途径。课后辅导是大学生课后学习的重要辅助&#xff0c;也是课…

h5禁用浏览器下载视频_【必备】 一键视频下载器插件,非常好用的浏览器插件!...

① 资源发布时&#xff0c;版本是最新的。时过境迁&#xff0c;无法保证能否正常使用&#xff0c;请善用公众号搜索功能&#xff0c;请及时下载最新版或留言。② 如果觉得资源对您有用&#xff0c;请收藏。如果觉得资源对他人有用&#xff0c;请转发。③ 如发现“无法运行“、“…

Oracle的to_char()函数使用

&#xff08;1&#xff09;用作日期转换&#xff1a; to_char(date,格式); select to_date(2005-01-01 ,yyyy-MM-dd) from dual; select to_char(sysdate,yyyy-MM-dd HH24:mi:ss) from dual; &#xff08;2&#xff09;处理数字&#xff1a; to_char(number,格式); select to_c…

linux(1):Linux经典面试题

Linux经典面试题,看看你会几题&#xff1f; 1. 在Linux系统中&#xff0c;以 文件 方式访问设备 。 2. Linux内核引导时&#xff0c;从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点 来标识。 4. 全部磁盘块由四个部分组成&#xff0c;分别…

access是不是计算机编程,access编程简介之二:用宏还是VBA?

时 间:2012-07-03 09:47:12作 者:摘 要:Access编程简介之二&#xff1a;我应该使用宏还是应该使用 VBA 代码&#xff1f;正 文:要决定是使用宏或 VBA 还是同时使用这两者&#xff0c;主要取决于您计划部署或分发数据库的方式。例如&#xff0c;如果数据库存储在您的计算机上…

语言三做一年级算题_一年级数学期末考试,学生交卷说能考100分,快让你家孩子试试吧...

时间不知不觉已到7月份了&#xff0c;各地小学将要迎来期末水平考试了&#xff0c;小学生也是十分开心&#xff0c;考完试又要放假了&#xff0c;更有小学生笑着对老师说“今年的假期有点长啊”&#xff0c;一句话把老师逗得哭笑不得。今天上午同事所在小学举行了一年级数学期末…

express+vue+mongodb+session 实现注册登录

上个月写了一篇文章是 expressmongodbvue 实现增删改查. 只是简单的实现了增删改查功能&#xff0c;那么今天是在那个基础之上做了扩展&#xff0c;首先实现的功能有如下&#xff1a; 1. 支持注册&#xff0c;登录功能&#xff0c;用户可以注册完成后&#xff0c;进行登录&…

linux(2):linux命令查看开放哪些端口

linux命令查看开放哪些端口 netstat -nupl (UDP类型的端口) netstat -ntpl (TCP类型的端口) a 表示所有 n表示不查询dns t表示tcp协议 u表示udp协议 p表示查询占用的程序 l表示查询正在监听的程序 netstat -nuplf|grep 3306 //这个表示查找处于监听状态的&#xff0c;端…

tcp 压力 测试 软件,强大的TcpServer压力测试工具及源码(附突破连接限制的方法和工具)...

压缩包 : 强大的TcpServer压力测试工具及源码(附突破连接限制的方法和工具).rar 列表G-Sockets(压力测试工具源码)\Demos\G-TcpClientDemo\G-TcpClientDemo.apsG-Sockets(压力测试工具源码)\Demos\G-TcpClientDemo\G-TcpClientDemo.cppG-Sockets(压力测试工具源码)\Demos\G-Tcp…

java 添加注解_你知道Java中的package-info的作用吗?

package-info.java对于日常业务开发的开发者来说&#xff0c;可能有点陌生&#xff0c;如果我们再项目中创建一个package-info.java&#xff0c;你会发现该类只有一个packge&#xff0c;如下我们无法在该java文件中定义public的类但事实上&#xff0c;package-info.java还有它的…

if else的使用以及如何从键盘获取数值

if-else的使用 顺序结构 顺序从上到下执行&#xff0c;中间没有判断和跳转 分支结构 根据条件&#xff0c;选择性地执行某段代码 有if-else和switch两种分支语句 循环结构 根据循环&#xff0c;重复性地执行某段代码 有while、do...while、for三种循环结构 如何从键盘获取数值 …

linux(3):Linux MBR分区、挂载操作步骤,逻辑卷扩容操作

Linux MBR分区、挂载操作步骤&#xff0c;逻辑卷扩容操作 服务器开机之后&#xff0c;能自动识别出硬盘&#xff0c;但是硬盘不能够存储数据&#xff0c;必须对硬盘进行分区、格式化、挂载后才能使用&#xff1b;linux主分区和拓展分区总数不能超过4个&#xff0c;拓展分区最…

计算机应用于材料组织结构检测,计算机在材料检测中的应用

计算机在材料检测中的应用[摘要]随着信息时代的来临&#xff0c;计算机应用已经成为社会发展的动力和趋势&#xff0c;其在各个行业中都有广泛的运用&#xff0c;在材料检测中更是运用广泛&#xff0c;成为材料检测的最有效手段。而要发挥计算机在材料检测这的巨大作用&#xf…

golang 没有名字参数_Go 返回参数命名

Go 返回参数命名在Golang中&#xff0c;命名返回参数通常称为命名参数。Golang允许在函数签名或定义中为函数的返回或结果参数指定名称。或者可以说这是函数定义中返回变量的显式命名。基本上&#xff0c;它解决了在return语句中提及变量名称的要求。通过使用命名返回参数或命名…

11 Python之初识函数

---恢复内容开始--- 1. 什么是函数?   f(x) x 1   y x 1   函数是对功能或者动作的封装 2. 函数的语法和定义   def 函数名():     函数体   调用:   函数名() 3. 关于函数的返回值   return : 返回     1. 当程序没写过return, 不返回任何结果. 如…

python对象属性在引用时前面需要加()_python基础-面向对象进阶

实现授权的关键点就是覆盖__getattr__方法1、通过触发__getattr__方法&#xff0c;找到read方法示例1:1 importtime2 classFileHandle:3 def __init__(self,filename,moder,encodingutf-8):4 self.fileopen(filename,mode,encodingencoding)5 self.modemode6 self.encodingenco…

linux(4):Linux逻辑卷详解总结

LVM是逻辑卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是建立在物理存储设备之上的一个抽象层&#xff0c;允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性。 LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大…