AT_agc022_a 题解
本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。
题目简述
给定字符串 \(S\) , 仅包含互不相同的小写字母, 你需要找到仅包含互不相同的小写字母的字符串中,第一个字典序比它大的字符串, 如果找不到输出 \(-1\)。(\(| S | \le 26\))
思路
这篇题解主要分享一下 map 的做法。
可分两种情况讨论:
字符串长度 \(< 26\)。
字符串长度 \(= 26\)。
因为互不相同所以不会出现大于 \(26\) 的情况。
对于样例 \(4\):abcdefghijklmnopqrstuvwzyx。
可将 w 变为它后面比它大但最小的 x,后面直接舍去即可,变为 abcdefghijklmnopqrstuvx。
解释完样例,先来讨论一下情况 \(1\),因为长度小于 \(26\),所以至少有 \(1\) 个字母未出现过,直接在字符串末尾加上没出现过的最小字母即可。
对于情况 \(2\),就可参考以上样例 \(4\) 的解释,可发现找到一个位置,把这个位置上的字母替换为它后面比它大但最小的字母即可,这个位置需要从后向前枚举。
那么接下来就是实现了,首先需要定义一个 map 容器,来存储哪些字母出现过或没出现过,对于情况 \(1\) 直接模拟即可。
对于情况 \(2\) 则需记录一个最大值,如果当前位置小于最大值再枚举,这样就避免了不合法的情况了。
经过以上分类讨论,很容易即可写出代码了:
#include<iostream>
#include<map>
using namespace std;
string str;
int maxn;
map<char, int> mp;
map<int, bool> vis;
int max(int x, int y) { return (x > y) ? x : y; }
int main() {
cin >> str;
int n = str.length(); // 记录长度
for(int i = 0; i < n; i ++) mp[str[i]] ++; // 计数
if(n < 26) {
for(int i = 'a'; i <= 'z'; i ++)
if(!mp[i]) {
cout << str << char(i) << endl; // 没有出现过,直接输出结束
return 0;
}
}
// 从后向前枚举
for(int i = n - 1; i >= 0; i --) {
// 满足条件,可输出
if(str[i] < maxn) {
for(int j = 0; j < i; j ++) cout << str[j];
for(int j = str[i] - 'a'; j < 26; j ++)
if(vis[j]) {
cout << char(j + 'a'); // 输出替换的字母
return 0;
}
}
maxn = max(maxn, str[i]);
vis[str[i] - 'a'] = true;
}
cout << "-1\n"; // 以上条件都不满足,输出 -1
return 0;
}
\]
AT_agc022_a 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- VSCode 圈复杂度插件 CodeMetrics
前言 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测 ...
- 【C#】使用WebHttpRequest调用Restful带token接口500 返回401 未授权错误
测试对方的接口,发现单个调用对方接口是可以的,但是多个连续的调用对方接口时,会出现第一条调用一般是200,随后的调用就会报500,401未授权的错误,除了第一条后面的请求数据几乎都不得行. 我于是用f ...
- HTML——标签语法
<标签名 属性1="属性值1" 属性2="属性值2"-->内容部分</标签名> <标签名 属性1="属性值1" ...
- 二叉树的遍历(BFS、DFS)
二叉树的遍历(BFS.DFS) 本文分为以下部分: BFS(广度优先搜索) DFS(深度优先搜索) 先序遍历 中序遍历 后序遍历 总结 BFS(广度优先搜索) 广度优先搜索[^1](英语:Breadt ...
- UIScrollView 在Autolayout下使用的一些问题
一.UIScrollView 双指放大手势,双击放大实现 在设置UIScrollView的frame后.maxZoomScale 和 minZoomScale之后,UIScrollView会自然支持双 ...
- 一文了解JVM面试篇(上)
Java内存区域 1.如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存.内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存 ...
- C# .NET 国密 SM2 签名 默认USER ID
C# .NET 国密 SM2 签名 默认USER ID: 1234567812345678 string userId = "1234567812345678"; byte[] b ...
- vuex中的数据在页面刷新后数据消失
用sessionstorage 或者 localstorage 存储数据 存储: sessionStorage.setItem( '名', JSON.stringify(值) ) 使用: sessio ...
- OOM异常的4种可能分析及常见的OOM异常演示
OOM异常的4种可能分析及常见的OOM异常演示 OOM异常: OutOfMemoryError 1.JAVA堆溢出JAVA堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到这些对象之间 ...
- 给你的博客加上个Live2D看板娘吧
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 给你的博客加上个Live2D看板娘吧 日期:2017-12 ...