[计数] aw3759. 第k个字符串(枚举+思维+aw周赛007_2)

1. 题目来源

链接:3759. 第k个字符串

2. 题目解析

计数问题。

n 个字符,n-2a,2 个 b,将 n 个中的两个字符变成 b,总的不同方案就是 C n 2 C_n^2 Cn2 没有问题。

很显然,是有规律的计数问题。按照字典序枚举即可,先枚举第一个 b 所在位置,再枚举第二个 b 的所有情况,b 在倒数第一个位置,则另一个 b 有一种情况,b 在倒数第二个位置,则另一个 b 有两种情况…

跳过前面的所有字典序,确定第一个 b 的位置,剩余了 k 个序列,第二个 b 就在第 k 个位置即可。

自己动手推推规律就行了。


时间复杂度: O ( l o g n ) O(logn) O(logn)

空间复杂度: O ( 1 ) O(1) O(1)


标程,直接拿数组做就行了,从 na 中修改两个 b 就行了。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        int n, k;
        cin >> n >> k;
        for (int i = n - 1; i; i -- )
        {
            if (k > n - i) k -= n - i;
            else
            {
                string s(n, 'a');
                s[i - 1] = s[n - k] = 'b';
                cout << s << endl;
                break;
            }
        }
    }

    return 0;
}

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

int n, k;

int main() {
    int T; cin >> T; while (T -- ) {
        cin >> n >> k;
        int t = 0, cnt = 0;
        while (k > t) cnt ++ , k -= t, t ++ ;       // cnt 为第一个 b 的位置
        string res(n - 2, 'a');
        res.insert(n - cnt - 1, 1, 'b');
        res.insert(n - k, 1, 'b');                  // 剩余的 k 即为第二个 b 的位置
        cout << res << endl;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值