蓝桥杯 2024 C++国 B最小字符串

P10910 [蓝桥杯 2024 国 B] 最小字符串

题目描述

给定一个长度为 N N N 且只包含小写字母的字符串 S S S,和 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,⋯,cM。现在你要把 M M M 个小写字母全部插入到字符串 S S S 中,每个小写字母都可以插入到任意位置。

请问能得到的字典序最小的字符串是什么?

输入格式

第一行包含两个整数 N N N 和 M M M。

第二行包含一个长度为 N N N 的字符串 S S S。

第三行包含 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,⋯,cM。

输出格式

输出一个长度为 N + M N + M N+M 的字符串代表答案。

输入输出样例 #1

输入 #1

复制代码
4 3
abbc
cba

输出 #1

复制代码
aabbbcc

输入输出样例 #2

输入 #2

复制代码
7 3
lanqiao
bei

输出 #2

复制代码
beilanqiao

说明/提示

【评测用例规模与约定】

对于 20 % 20\% 20% 的评测用例, M = 1 M = 1 M=1。

对于 100 % 100\% 100% 的评测用例, 1 ≤ N , M ≤ 1 0 5 1 \le N, M \le 10^5 1≤N,M≤105。

核心思路:在遇到更大字符前插入所有更小字符,直接排序b数组,然后挨个比较。这里记得一个细节一定要b[bi]<a[ai],如果是小于等于只对20%

为什么 < 正确:当 b[bi] == a[ai] 时,选择添加原字符 a[ai] 而非插入 b[bi],这样可以让 b[bi] 在后续遇到更大字符时发挥作用,从而获得更小的字典序。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
string a,b;
int main(){
    cin>>n>>m>>a>>b;
    sort(b.begin(),b.end());
    string ans="";
    int ai=0,bi=0;
    while(a[ai]||b[bi]){
        if(!a[ai]&&b[bi]){
            cout<<b[bi++];
        }
        else if(a[ai]&&!b[bi]){
            cout<<a[ai++];
        }
        else if(b[bi]<a[ai]){
            cout<<b[bi++];
        }
        else{
            cout<<a[ai++];
        }
    }
    return 0;
}
相关推荐
晚风吹长发2 小时前
二分查找算法+题目详解
c++·算法·二分查找
罗义凯2 小时前
其中包含了三种排序算法的注释版本(冒泡排序、选择排序、插入排序),但当前只实现了数组的输入和输出功能。
数据结构·c++·算法
春蕾夏荷_7282977253 小时前
c++ easylogging 使用示例
c++·log·easylogging
syt_biancheng3 小时前
Day3算法训练(简写单词,dd爱框框,3-除2!)
开发语言·c++·算法·贪心算法
自然数e4 小时前
C++多线程【线程管控】之线程转移以及线程数量和ID
开发语言·c++·算法·多线程
John_ToDebug4 小时前
重建内在秩序:从神经科学理解情绪的逻辑
程序人生·职场和发展
Elias不吃糖6 小时前
epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现
linux·c++·event
AA陈超6 小时前
ASC学习笔记0017:返回此能力系统组件的所有属性列表
c++·笔记·学习·ue5·虚幻引擎
Swift社区6 小时前
LeetCode 425 - 单词方块
算法·leetcode·职场和发展
Unlyrical7 小时前
splice, io_uring_prep_splice 调用(无效参数)
linux·服务器·c++·unix