正题

题目链接:https://www.luogu.org/problemnew/show/P3279


题目大意

一个字符串满足:

  1. 有nnn个字符
  2. 仅包含小写字母
  3. 告诉你每个字符为中心的最大回文串长度
  4. 告诉你每个两个字符的间隙为中心的最大回文串长度

求满足要求的字典序最小的字符串。


解题思路

因为字典序最小,所以优先满足前面的最小。我们可以找出相同不相同的关系。然后对于每段相等关系就将前面的一半复制到后面去

这样是O(n2)O(n^2)O(n2)的,并不能胜任此题,我们可以发现很多关系都是重复的,所以需要使用ManacherManacherManacher逆推找出O(n)O(n)O(n)的关系。

我们先将字符串的间隙之间插入′∗′'*'′∗′字符然后现在我们这知道每个串为中心的回文串,用fi,jf_{i,j}fi,j​表示第iii个位置不可以填jjj这个字符,rir_iri​表示以iii为中心的最长回文串长度。

一个位置会被更新多次,我们考虑两种情况

  1. 若i≤maxrighti\leq maxrighti≤maxright那么我们知道目前的iii中是min{maxright−i+1,r2∗pos−i}min\{maxright-i+1,r_{2*pos-i}\}min{maxright−i+1,r2∗pos−i​}的字符是已经更新过的,无需再更新
  2. 若i>maxrighti>maxrighti>maxright那么我们无法知道iii的已更新回文串的信息,那么就老老实实的全部更新

然后要注意中间的不相等情况也需要O(1)O(1)O(1)更新

然后更新maxrightmaxrightmaxright


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+100;
int n,r[N],maxn,pos;
bool f[N][26];
char str[N];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&r[i*2-1]),r[i*2-1]++;for(int i=1;i<n;i++)scanf("%d",&r[i*2]),r[i*2]++;n=n*2;str[0]='*';str[1]='a';r[0]=1;for(int i=0,mr=-1;i<=n;i++){int j=0;if(!(i&1)) str[i]='*';else if(str[i]<'a'){for(;j<26;j++)if(!f[i][j]) break;str[i]=j+'a';}if(maxn>i) j=min(maxn-i+1,r[2*pos-i]);else j=1;for(j--;j<r[i];j++) str[i+j]=str[i-j];if(r[i]<=i) f[i+r[i]][str[i-r[i]]-'a']=1;if(maxn<i-j+1) maxn=i+r[i]-1,pos=i;}for(int i=1;i<=n;i+=2)printf("%c",str[i]);
}

P3279-[SCOI2013]密码【Manacher】相关推荐

  1. Manacher思想 SCOI2013 密码

    关于$\mathrm{Manacher}$算法,网上介绍已经很全面 这里说一下自己的理解 这里的$rad$数组:$rad_i$表示以以位置i为中心的最长回文串的回文半径(不包括i这个点). 朴素的思想 ...

  2. 和各路巨佬の随机挑战3总结

    第三次挑战\huge \texttt{\color{purple}第\color{blue}三\color{green}次\color{block}挑\color{red}战}第三次挑战 规则 随机挑 ...

  3. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  4. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  5. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

  6. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  7. 华为机试在线训练-牛客网(20)【中级】字符串运用-密码截取

    题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如 ...

  8. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

    现象:在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码.通讯内容或信用卡信息). 当点开"了解详情"后显示 ...

  9. 设置linux初始root密码

    简单一步设置linux第一个root密码 sudo passwd root #输入当前账户密码 #输入准备设置的root密码 #确认密码 如下所示:

最新文章

  1. 20_集合_第20天(Map、可变参数、Collections)
  2. linux任务调度语法,linux crond任务调度-Go语言中文社区
  3. asp.net定点执行任务总结
  4. 乐迪智能陪伴机器人_【团品】AI未来人工智能陪伴机器人(爆款复团)
  5. 什么推动当今品牌的忠诚度
  6. 查询指定目录下的文件中是否包含指定字符串
  7. 深度学习-自动并行计算
  8. 阿里云CentOS Linux 7安全基线检查
  9. MicroBlaze AXI总线 GPIO中断使用(On Atyls Board)
  10. python中pickle模块讲解
  11. powerdesigner导入sql生成pdm没有注释_PDM手写签名实现方法
  12. RedHat7可视化图形界面安装
  13. 8段数码管与字符对照表
  14. IDL 解析葵花8Himawari-8标准数据(HSD),辐射定标、重投影、裁剪
  15. 2019年管理类MBA/MEM联考英语小作文范文
  16. 关于tensor的shape理解
  17. calcite learn
  18. RS485通信----基本原理+电路图
  19. uniAPP 禁用原生导航栏 和 获取状态栏高度 和 使用(间距掉)
  20. javascript百炼成仙 第一章 掌握JavaScript基础1.6 叶老

热门文章

  1. php ip处理函数,PHP取ip地址函数
  2. floatmap 二维数组_用J中的多维数组进行Arrays.fill
  3. tars框架php,TarsPHP: TARS-PHP是针对php使用tars二进制协议,以及tars平台整体运维、RPC等一系列能力的解决方案...
  4. leetcode206. 反转链表
  5. leetcode93. 复原 IP 地址
  6. 77. 组合016(回溯法)
  7. 7-7 有重复元素的全排列 (10 分)(set容器做法思路加详解)
  8. [Java基础]注解概念
  9. [Java基础]异常概述与异常处理
  10. [C++STL]C++实现stack容器适配器