蓝桥杯 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] 在后续遇到更大字符时发挥作用,从而获得更小的字典序。
#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;
}