[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,一经查实,立即删除!

相关文章

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

① 资源发布时&#xff0c;版本是最新的。时过境迁&#xff0c;无法保证能否正常使用&#xff0c;请善用公众号搜索功能&#xff0c;请及时下载最新版或留言。② 如果觉得资源对您有用&#xff0c;请收藏。如果觉得资源对他人有用&#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;进行登录&…

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;拓展分区最…

曾国藩:诚敬静谨恒!

曾国藩:诚敬静谨恒。诚&#xff1a;民无信不立&#xff01;人与人交往&#xff0c;最讲究诚字。与他人坦诚&#xff0c;说话有诚信&#xff0c;对人诚心&#xff0c;自然会受到他人喜爱和尊重。敬&#xff1a;月满则亏&#xff0c;物盛则衰&#xff01;要想成大事&#xff0c;需…

java学习(103):字符串概述

//字符串概述 public class test40 {public static void main(String[] args){char[] str1{1,2,3,4,5,6,7,8,9};String str2new String("我是歌谣");String str3new String(str1);String str4new String(str1,3,4);String str5new String("\"\\");Sys…

计算机服务哪些不能关闭,Win7系统下哪些系统服务不能关闭

为了让系统能够更快的启动&#xff0c;很多用户会选择禁用一些系统服务&#xff0c;但并不是所有的服务都能够禁用关闭的&#xff0c;下面是小编与大家分享的Win7系统下哪些不能关闭的服务&#xff0c;保证大家的电脑能够正常的运行。第一、DHCPClient服务这款服务是电脑获取IP…

java学习(104):字符串equals,charAt,endwith,startwith方法

//String方法 public class test41 {//比较两个人的姓名是否相同public static boolean eqName(String name1,String name2){return name2.equals(name1)?true:false;}//按照给定的字符的索引返回public static char findNUM(String resouse,int index){if(index<0||index&…

java学习(105):字符串indexof,spilt,substring方法

public class test44 {//分割字符串数组public static String[] spitString(String resource,String tag){return resource.split(tag);} }测试 public class test43 {public static void main(String[] args){//String的indexofString mail"javascript.com";System…

初中人教版计算机具体课程,构建信息技术支持下的中学数学课程

摘要&#xff1a;信息时代&#xff0c;数学教育面临着前所未有的机遇和挑战。本文首先结合信息技术的特点&#xff0c;阐述了数学教学方式发生的变化。在此背景下&#xff0c;探讨了数学教学内容也应随之发生变化&#xff0c;数学课程应当尽可能地使用计算器和计算机&#xff0…

朴素贝叶斯应用:垃圾邮件分类

1. 数据准备&#xff1a;收集数据与读取 2. 数据预处理&#xff1a;处理数据 3. 训练集与测试集&#xff1a;将先验数据按一定比例进行拆分。 4. 提取数据特征&#xff0c;将文本解析为词向量 。 5. 训练模型&#xff1a;建立模型&#xff0c;用训练数据训练模型。即根据训练样…

java学习(106):字符串tocharArray,tolowercase,touppercase方法

public class test45 {//将给定的字符串返回成一个数组public static char[] toArrayFromString(String target){return target.toCharArray();}//大小写转换根据所给的第二个参数取决于大小写转换public static String toLowerUpper(char[] chs,char ch){if(chl||chL)return …

win10计算机启动一分钟重启,Win10开机提示电脑将在一分钟后自动重启怎么办?...

Win10开机提示“你的电脑将在一分钟后自动重启”怎么办&#xff1f; 最近一位用户又遇到了开机问题&#xff0c;该用户在开机后总是提示“你的电脑将在一分钟后自动重启&#xff0c;Windows遇到问题并且需要重新启动&#xff0c;你应立刻关闭此消息并保存你的工作。”&#xff…

xman的思维导图快捷键_一图胜千言,免费的多人协作思维导图工具,推荐收藏值得拥有哦...

今天给大家推荐一款思维导图制作软件&#xff1a;GitMind&#xff0c;捕捉灵感&#xff0c;激发创意。免费在线思维导图软件&#xff0c;简化逻辑梳理&#xff0c;集思广益&#xff0c;释放创造力在线脑图、思维导图、流程图、工业设计、工程管理&#xff0c;一图涵千面。GitMi…

java学习(107):StringBuilder

//stringbuilder public class test47 {public static void main(String[] args){StringBuilder buildernew StringBuilder("我是一个热血的少年");System.out.println(builder);} }运行结果

单点登录 之 OAuth

OAuth2.0是什么 OAuth2.0是什么——豆瓣和QQ的故事 OAuth简单说就是一种授权的协议&#xff0c;只要授权方和被授权方遵守这个协议去写代码提供服务&#xff0c;那双方就是实现了OAuth模式。 举个例子&#xff0c;你想登录豆瓣去看看电影评论&#xff0c;但你丫的从来没注册过豆…

ueditor上传图片写入数据库_手把手教你,如何用交管12123上传驾驶证照片!

12123APP普及后方便了很多司机朋友足不出户就能办理交管业务然而交管业务网上办理过程中因为一些小问题的存在导致业务受理受阻例如&#xff1a;司机朋友在使用“交管12123”手机APP办理补换领机动车驾驶证等业务时出现了以下情况▼这种情况可能有两种原因&#xff1a;第一种是…