题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4319

思维还是不行...这样的构造都没思路...

首先,我们可以按 rank 的顺序从小到大填字母,不能填了就是无解;

为了能让后面有字母可填,现在填的字母就要尽可能小;

考虑排名为 i 的后缀首字母能否和排名 i-1 的后缀首字母一样,发现只要判断去掉这个字母后能否满足即可,因为我们先保证后面都可以填成满足排名的形式;

所以,如果下一个位置大小关系是 rk[sa[i]+1] < rk[sa[i-1]+1],那么 sa[i] 位置就不能和 sa[i-1] 填一样的字母,只能填更大的;

这样填到不能填了,就是无解,否则就构造出来答案了;

关键在于一个一个考虑位置!

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=5e5+;
int n,sa[xn],rk[xn],ans[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int main()
{
n=rd();
for(int i=,x;i<=n;i++)sa[i]=rd(),rk[sa[i]]=i;
ans[sa[]]=;
for(int i=,p=;i<=n;i++)
{
if(rk[sa[i]+]<rk[sa[i-]+])ans[sa[i]]=++p;
else ans[sa[i]]=p;
if(p>){puts("-1"); return ;}
}
for(int i=;i<=n;i++)printf("%c",ans[i]+'a'); puts("");
return ;
}

最新文章

  1. [原创]关于Hibernate中的级联操作以及懒加载
  2. Thisgood
  3. 160809212田京诚C语言程序设计实验2 选择结构程序设计_进阶
  4. MultiTouch————多点触控,伸缩图片,变换图片位置
  5. SIFT算法:确定特征点方向
  6. git 分支策略
  7. 解决svn: Cannot negotiate authentication mechanism错误问题
  8. leetcode Binary Tree Postorder Traversal python
  9. Jmeter-----【mac电脑】配置web浏览器的代理抓取请求
  10. docker常用命令总结
  11. Joone
  12. FastDFS分布式文件系统配置文件详解
  13. android开发之图表
  14. pytest八:skip 跳过用例
  15. WebMagic编译时提示Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.18的解决方法
  16. file_put_contents结合print_r,打造日志功能
  17. Discuz常见小问题-如何为每个板块设置不同的图标
  18. Java使用HttpClient实现Post请求
  19. Package libvirt was not found in the pkg-config search path
  20. SQL导入的方法,网上看到的

热门文章

  1. Java结束线程的三种方法
  2. 相机标准之onvif---开放型网络视频接口论坛onvif 简介
  3. WPF实现ScrollViewer滚动到指定控件处
  4. access变转换为mysql表工具
  5. 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)
  6. 九度OJ 1056:最大公约数 (GCD)
  7. Greedy Function Approximation:A Gradient Boosting Machine
  8. bmdiff snappy lzw gzip
  9. mysql系列之7.mysql读写分离
  10. ideal 快捷键