题目描述

给出一个只包含小写字母的字符串的长度、以每一个字符为中心的最长回文串长度、以及以每两个相邻字符的间隙为中心的最长回文串长度,求满足条件的字典序最小的字符串。

输入

输入由三行组成。
第一行仅含一个整数N,表示密码的长度。
第二行包含N 个整数,表示以每个字符为中心的最长回文串长度。
第三行包含N - 1 个整数,表示每两个相邻字符的间隙为中心的最长回文串长度。
1 <= n <= 10^5。

输出

输出仅一行。输出满足条件的最小字典序密码。古籍中的信息是一定正确的,故一定存在满足条件的密码。

样例输入

Sample #1
3
1 1 1
0 0
Sample #2
3
1 3 1
0 0
Sample #3
3
1 3 1
2 2

样例输出

Sample #1
abc
Sample #2
aba
Sample #3
aaa


题解

逆模拟Manacher

本题和 bzoj4974 类似,只不过变成了回文串长度。

那么可以考虑逆模拟Manacher算法的过程:从上一个已经确定的回文串位置开始,到当前回文半径结束,这些串都满足回文串的性质,所以后面的字符可以直接由前面的字符确定。

而如果当一个字符没有确定,此时的情况较那题更难处理——一个位置结尾的所有回文串。

我们不妨换一个思路:当一个位置达到最大回文长度时,说明下一个长度不再满足回文串的性质。因此可以直接对于每个位置开一个大小为26的桶,当达到最大回文长度时,就让后面的下一个字符与前面的上一个字符标记为不同。当一个字符没有确定时,就在其对应的桶中找到字典序最小的字符,设为当前字符。

时间复杂度$O(26n)$。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char str[200010];
int p[200010] , vis[200010][26];
int main()
{
int n , i , j , mx = 0 , last;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &p[i * 2 - 1]);
for(i = 1 ; i < n ; i ++ ) scanf("%d" , &p[i * 2]);
str[0] = '#';
for(i = 1 ; i <= n * 2 - 1 ; i ++ )
{
if(mx < i)
{
for(j = 0 ; j < 26 ; j ++ )
if(!vis[i][j])
break;
str[i] = j + 'a';
}
for(j = (mx >= i ? min(mx - i + 1 , p[2 * last - i]) : 1) ; j <= p[i] ; j ++ ) str[i + j] = str[i - j];
if(i > p[i]) vis[i + p[i] + 1][str[i - p[i] - 1] - 'a'] = 1;
if(i + p[i] > mx) mx = i + p[i] , last = i;
}
for(i = 1 ; i < n * 2 ; i += 2) putchar(str[i]);
printf("\n");
return 0;
}

【bzoj3325】[Scoi2013]密码 逆模拟Manacher的更多相关文章

  1. BZOJ 3325 [SCOI2013]密码 (逆模拟Manacher+构造)

    题目大意:给你一个字符串每个位置和相邻两个位置为回文中心的最长回文串长度,让你构造一个合法的字典序最小的字符串 挺有意思的构造题 首先按照$Manacher$的思想还原$p$数组 定义$f_{ij}$ ...

  2. 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)

    传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...

  3. BZOJ3325 [Scoi2013]密码【Manacher】【构造】【贪心】

    Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信 ...

  4. BZOJ3325 [Scoi2013]密码 【manacher】

    题目 Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密码的长度 ...

  5. BZOJ3325 : [Scoi2013]密码

    从以每一位为中心的回文串长度可以用Manacher倒推出$O(n)$对相等和不等关系. 将相等的用并查集维护,不等的连边. 然后输出方案时若还没被染过色,则求一个mex. #include<cs ...

  6. 【BZOJ3325】[Scoi2013]密码 Manacher

    [BZOJ3325][Scoi2013]密码 Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进. ...

  7. 【bzoj4974】字符串大师 逆模拟KMP

    题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是$T^k$(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k( ...

  8. luogu P3279 [SCOI2013]密码

    LINK:密码 给出来manacher的数组 让还原出字典序最小的字符串.字符集为小写字母. 当没有任何限制时 放字典序最小的'a'.如果此时还在最长的回文串中的话那么 直接得到当前字符即可. 注意这 ...

  9. Manacher思想 SCOI2013 密码

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

随机推荐

  1. 初尝微信小程序2-基本框架

    基本框架: .wxml :页面骨架 .wxss :页面样式 .js :页面逻辑    描述一些行为 .json :页面配置 创建一个小程序之后,app.js,app.json,app.wxss是必须的 ...

  2. 牛客小白月赛2 D 虚虚实实 【欧拉图】【连通图】

    链接:https://www.nowcoder.com/acm/contest/86/D来源:牛客网 题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省 ...

  3. 【学时总结】 ◆学时·II◆ IDA*算法

    [学时·II] IDA*算法 ■基本策略■ 如果状态数量太多了,优先队列也难以承受:不妨再回头看DFS-- A*算法是BFS的升级,那么IDA*算法是对A*算法的再优化,同时也是对迭代加深搜索(IDF ...

  4. 网页更换主题以及绘制图形js代码实现

    HTML代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. 使用select2 宽度自适应

    加一个CSS属性:style = "width : 100%"

  6. java.lang.UnsupportedOperationException 原因以及解决方案

    如下代码: Map[] cardProds = JsonUtils.getObject(oldCartValue, new TypeReference<Map[]>(){}); List& ...

  7. python--Wrapper

    然后给大家介绍的是Wrapper(装饰器),使用广泛.python笔试,面试的话也会百分百问到的,基础和中级的知识储备还是必用的. 让我们开始. 先来一些基础相关知识 *args,**kwargs的区 ...

  8. mysql悲观锁与乐观锁

    简介 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 用途 乐观锁和悲观锁是并发控制主要采用的技术手段.无论是悲观 ...

  9. jupyter notebook中出现ValueError: signal only works in main thread 报错 即 长时间in[*] 解决办法

    我在jupyter notebook中新建了一个基于py3.6的kernel用来进行tensorflow学习 但是在jupyter notebook中建立该kernel时,右上角总是显示 服务正在启动 ...

  10. Lighting System Design UVA - 11400 动态规划

    题目:题目链接 思路:简单的动态规划问题,先把灯泡按照电压从小到大排序.设s[i]为前i种灯泡的总数量(即L值之和),d[i]为灯 泡1-i的最小开销,则d[i] = min{d[j] + (s[i] ...