题目大意:
给定两个字符串 a,ba,b,保证两个字符串中的字符无交,即不存在某个字符同时在两个串中都出现了,要求通过以下的两种操作构造一个新的字符串 cc,使得 cc 的字典序最小,并且要求不能连续使用某一种操作超过 kk 次。
1.从 aa 中任选一个字符插入到 cc 的末尾。
2.从 bb 中任选一个字符插入到 cc 的末尾。
若某一个字符串为空则认为构造结束。
若字符串 xx 比字符串 yy 字典序小则必定满足以下两种情况之一:
1.xx 为 yy 的前缀,且 x \not= yx=y。
2.从左到右的顺序,xx 与 yy 第一个不同的位置上 xx 的字符的字典序比 yy 的字符的字典序小。
大体思路:
这个题其实就是个模拟题,按照题意一步步模拟即可,先将字符串 中的字符按字典序排序,然后从 前往后往答案字符串中放,直至其中一个放完为止,因为最多可以在一个字符串中连续取 k个,用 t1和 t2分别来记录字符串a 和 b当前连续取了多少个,放置时在特判 a[i]和b[j] 的字典序大小时还要特 判是否在同一个字符串中连续取了k次。
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,m,k;
cin >> n >> m >> k;
string a,b;
cin >> a >> b;
sort(a.begin(),a.end());
sort(b.begin(),b.end());
string ans;
int t1 = 0,t2 = 0;
int i = 0,j = 0;
while(n > 0 & m > 0)
{
if(a[i] < b[j])
{
if(t1 == k)
{
ans += b[j ++];
m --;
t2 ++;
t1 = 0;
}
else
{
t1 ++;
ans += a[i ++];
n --;
t2 = 0;
}
}
else
{
if(t2 == k)
{
ans += a[i ++];
n --;
t1 ++;
t2 = 0;
}
else
{
t2 ++;
ans += b[j ++];
m --;
t1 = 0;
}
}
}
cout << ans << endl;
return;
}
int main()
{
int t = 1;
cin >> t;
while(t --)
solve();
return 0;
}