首页 > 其他分享 >AT_agc022_a 题解

AT_agc022_a 题解

时间:2023-07-29 09:56:15浏览次数:48  
标签:map 26 int 题解 str 字符串 agc022

洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给定字符串 \(S\) , 仅包含互不相同的小写字母, 你需要找到仅包含互不相同的小写字母的字符串中,第一个字典序比它大的字符串, 如果找不到输出 \(-1\)。(\(| S | \le 26\))

思路

这篇题解主要分享一下 map 的做法。

可分两种情况讨论:

  1. 字符串长度 \(< 26\)。

  2. 字符串长度 \(= 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;
}

提交记录

\[\text{The End!} \]

标签:map,26,int,题解,str,字符串,agc022
From: https://www.cnblogs.com/So-noSlack/p/17589323.html

相关文章

  • 【题解】[2023牛客多校] Qu'est-ce Que C'est?
    题目传送门:[2023牛客多校]Qu'est-ceQueC'est?题意给定\(n,m\)构造\(a_{1},a_{2},...,a_{n}\),其中\(a_{i}\in[-m,m]\)之间取值。需要保证序列任意连续子段和都非负。\(0\leqn,m\leq5000\)分析记录合法序列的最小后缀。通过最小后缀来判断下一个数的取值范围。......
  • Codeforces Round 888 (Div. 3) 题解
    考场上\(7\)题做出来\(4\)题,最后几分钟才把D题调出来,但还是吃了不少罚时A.EscalatorConversations\(O(n)\)枚举即可,对于每个人计算需要的间隔台阶数是否在\((0,m)\)以内以及相差高度是否是\(k\)的倍数B.ParitySort显然,偶数和奇数是不可能产生交换操作的,而偶数......
  • P2679 [NOIP2015 提高组] 子串 题解
    原题\(题目大意\)\(从字符串a中选出k个子串s_1,s_2,s_3...s_k使得s_1+s_2+s_3+...+s_k=b\)\(求总方案数对10^9+7取模的结果\)\(1\le|a|即n\le1000,1\le|b|即m\le200,1\lek\le|b|\)\(设f_{i,j,x}表示已经选到a的第i个字符,b的第j个字符,共选了x个子串的方案数\)\(则可得......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台大并发下SIP消息出现重复SN号的问题解
    随着国家倡导平安城市、智慧城市的建设,安防视频监控作为智慧城市安防建设的重要环节,也越来越受到重视。LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲、平台级联等功能。我......
  • HDU1702 ACboy needs your help again! 题解
    #include<iostream>#include<string>#include<queue>#include<stack>usingnamespacestd;intt,n,m;intmain(){cin>>t;while(t--){queue<int>q;stack<int>s;stringop,str......
  • HDU4841 AHOI1999 圆桌问题 题解
    朴素的约瑟夫问题,用vector处理即可#include<iostream>#include<vector>usingnamespacestd;//AHOI1999圆桌问题类似于约瑟夫问题vector<int>table;intn,m;intmain(){while(cin>>n>>m){table.clear();for(inti=0;......
  • P2127 序列排序 题解
    原题题目意思\(有一个数列a,每次可以挑选任意两个元素交换位置,代价为这两个元素的和,问把序列a升序排序所需的最小总代价\)\(定义数列上的一个有i个元素的环S使得s_1要换到s_2,s_2要到s_3,……,s_i要到s_1\)\(原图一个元素只有一个目标位置,所以可以看作一个有n点,n边的有向图\)......
  • 【题解】[HNOI2015] 落忆枫音
    题目传送门感觉这题挺有意思的,遂写。题目大意给出一个有向无环图,再给定两个点\(s\)和\(t\),表示在点\(s\)和\(t\)间加上一条边。求这个图有多少种生成树。题目分析首先考虑不加边之前的情况,假设给定下面这个图:根据树的定义,除根节点外的节点有且只有一个父亲节点,也就......
  • 【AI夏令营】NLP赛题解析与Baseline逐行精读
    【任务】1.深入研读baseline代码,仔细理解其每个部分,并记录详尽的学习笔记;2.主动挑战自己,对基线代码进行优化,力求改进代码的实际效果和性能;3.完成任务二,并查看个人成绩排行榜。【Baseline精读】本次主要是针对任务二(关键词提取,也会有部分任务一的内容)首先是库文件的导入:#......
  • AT_arc113_c 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述现在有一个字符串\(S\),每一次你可以选择一个\(i(1\lei\le|S|)\),如果\(S_i=S_{i+1}\neS_{i+2}\)。就可以将\(S_{i+2}\)设为\(S_i\)求最多能操作几次。思路本......