【BZOJ3325】[Scoi2013]密码 Manacher
【BZOJ3325】[Scoi2013]密码
Description
Input
输入由三行组成。
第一行仅含一个整数N,表示密码的长度。
第二行包含N 个整数,表示以每个字符为中心的最长回文串长度。
第三行包含N - 1 个整数,表示每两个相邻字符的间隙为中心的最长回文串长度。
对于20% 的数据,1 <= n <= 100。
另有30% 的数据,1 <= n <= 1000。
最后50% 的数据,1 <= n <= 10^5。
Output
输出仅一行。输出满足条件的最小字典序密码。古籍中的信息是一定正确的,故一定存在满足条件的密码。
Sample Input
3
1 1 1
0 0
Sample #2
3
1 3 1
0 0
Sample #3
3
1 3 1
2 2
Sample Output
abc
Sample #2
aba
Sample #3
aaa
题解:我们模拟Manacher的过程,Manacher的时候是当str[..]=str[..]时,rl[i]++,那么我们已知了rl,如果rl比当前值大了,则说明str[..]=str[..],否则str[..]!=str[..]。
相等的条件比较好判断,那不等的条件呢?用f[i][j]表示i字符能不能取j,那么如果i字符没有与...相等的条件,就让它等于i可以取的最小字符即可。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=200010;
char str[maxn];
int n,mx,pos;
int rl[maxn],f[maxn][26];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,j;
for(i=1;i<=n;i++) rl[i*2-1]=rd()+1;
for(i=1;i<=n-1;i++) rl[i*2]=rd()+1;
n<<=1,str[1]='a',str[0]='*',rl[0]=1;
for(i=0,mx=-1;i<=n;i++)
{
if(!(i&1)) str[i]='*';
else
{
if(str[i]<'a')
{
for(j=0;j<26;j++) if(!f[i][j]) break;
str[i]='a'+j;
}
}
if(mx>i) j=min(mx-i+1,rl[2*pos-i]);
else j=1;
for(j--;j<rl[i];j++) str[i+j]=str[i-j];
if(rl[i]<=i) f[i+rl[i]][str[i-rl[i]]-'a']=1;
if(mx<i+rl[i]-1) mx=i+rl[i]-1,pos=i;
}
for(i=1;i<n;i+=2) printf("%c",str[i]);
return 0;
}
【BZOJ3325】[Scoi2013]密码 Manacher的更多相关文章
- BZOJ3325 [Scoi2013]密码【Manacher】【构造】【贪心】
Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信 ...
- BZOJ3325 [Scoi2013]密码 【manacher】
题目 Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密码的长度 ...
- 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)
传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai,aia_iai表示以sis_isi为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...
- BZOJ3325 : [Scoi2013]密码
从以每一位为中心的回文串长度可以用Manacher倒推出$O(n)$对相等和不等关系. 将相等的用并查集维护,不等的连边. 然后输出方案时若还没被染过色,则求一个mex. #include<cs ...
- 【bzoj3325】[Scoi2013]密码 逆模拟Manacher
题目描述 给出一个只包含小写字母的字符串的长度.以每一个字符为中心的最长回文串长度.以及以每两个相邻字符的间隙为中心的最长回文串长度,求满足条件的字典序最小的字符串. 输入 输入由三行组成.第一行仅含 ...
- Manacher思想 SCOI2013 密码
关于$\mathrm{Manacher}$算法,网上介绍已经很全面 这里说一下自己的理解 这里的$rad$数组:$rad_i$表示以以位置i为中心的最长回文串的回文半径(不包括i这个点). 朴素的思想 ...
- BZOJ 3325 [SCOI2013]密码 (逆模拟Manacher+构造)
题目大意:给你一个字符串每个位置和相邻两个位置为回文中心的最长回文串长度,让你构造一个合法的字典序最小的字符串 挺有意思的构造题 首先按照$Manacher$的思想还原$p$数组 定义$f_{ij}$ ...
- SCOI2013 密码
题目描述: Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进. 通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密 ...
- luogu P3279 [SCOI2013]密码
LINK:密码 给出来manacher的数组 让还原出字典序最小的字符串.字符集为小写字母. 当没有任何限制时 放字典序最小的'a'.如果此时还在最长的回文串中的话那么 直接得到当前字符即可. 注意这 ...
随机推荐
- 倍福TwinCAT(贝福Beckhoff)应用教程12.2 TwinCAT控制松下伺服 NC初步
在前面我们已经学会了使用贝福自带的调试软件完成试运行,接下来是使用TWINCAT PLC实现这个功能,右击PLC添加一个PLC项目 在VISUs上右击添加一个HMI人机界面 目前PLC程序和人 ...
- Laravel 学习 .env文件 getenv 获得环境变量的值
Laravel 学习 .env文件 getenv 获得环境变量的值 我们还需要对应用的 .env 文件进行设置,为应用指定数据库名称 sample. .env . . . DB_DATABASE=s ...
- taro + iview 实现跨平台开发(App,Wap,微信小程序)
1.安装 (1)安装脚手架 npm install -g @tarojs/cli taro init myApp (2)H5端运行 npm run dev:h5 taro build --type h ...
- 移动端H5页面 input 获取焦点时,虚拟键盘挡住input输入框解决方法
在移动端h5开发的时候,发现如果input在页面底部,当触发input焦点的时候会弹出系统虚拟键盘,虚拟键盘会遮挡input输入框.这会很影响用户体验,于是在网上找到了如下的解决办法: 方法一:使用w ...
- html checkbox 实现全选/取消全选
html checkbox 实现全选/取消全选 <html> <body> <table border="1"> <tr> < ...
- android-seekbar的thumb图片不居中显示的处理办法
seekbar更换图片后,发现thumb的图片不会居中(竖直方向)显示了,代码如下: <SeekBar android:id="@+id/wb_seekbar" androi ...
- TCP/IP ---分层
TCP/IP的分层 ICMP是IP协议的附属协议.IP层用它来与其他主机或路由器交换错误报文和其他重要信息.尽管ICMP主要被IP使用,但应用程序也有可能访问它.我们将分析两个流行的诊断工具,Ping ...
- JAVA代码之RocketMQ生产和消费数据
一.启动RocketMQ [root@master ~]# cat /etc/hosts # Do not remove the following line, or various programs ...
- [Oracle] - Install Oracle12cR1 on Oracle Linux 6.5 in VirtualBox
My Oralce Linux 6.5 is running on VirtualBox. Basic settings is 4G memory, 50G hard-disk, auto parti ...
- PHP输出xls文件
PHP输出xls文件 标签: phpexcelxmlcsvborderheader 2008-11-17 09:33 2611人阅读 评论(0) 收藏 举报 分类: WebDev(9) 版权声明: ...