Lex String

题目大意:

给定两个字符串 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;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值