【构造】构造一个字符串满足k个子序列问题总结

简介: 【构造】构造一个字符串满足k个子序列问题总结

题目 Codeforces Subsequences

题目链接 :Codeforces Subsequences

题目大意:
在这里插入图片描述

构造一个字符串,至少包含k个 codeforces子序列,并且字符串最短。

思路:构造

假设我们要找的不是 codeforces的子序列,而是 abcde。如果一个字符串中 a字母不在最前面,那么把它移到最前面其他不变的话,就多了一个 abcde序列。所以为了让序列更多,那么只需要将所有的 a都移动到最前面即可。 b跟着 a的后面, c跟着 b的后面,其他也如此。

每个字母的排序问题已经解决了,那么现在就是每个字母有多少个的问题了。答案是我们应该让每个字母的数量尽可能接近。

证明:子序列的数量就等于 SumA * SumB * SumC * SumD * SumESumA表示a的数量,如果 SumA - SumB > 1的话,那么(SumA - 1) * (SumB + 1) > SumA * SumB ,所以为了让字符串更短,所以让每个字母的数量尽可能接近。

现在我们就可以通过循环增加每个字符的数量,一旦乘积至少为k,那么就退出循环,最后打印每个字母的数量即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10, inf = 0x3f3f3f3f, mod = 998244353;
int n, k;
ll a[N], c[N];
signed main()
{
#ifdef Xin
    freopen("in.in", "r", stdin);
    freopen("out.out", "w", stdout);
#endif

    ll k;
    cin >> k;
    string s = "codeforces";
    int n = s.size();
    vector<int> a(n, 1);
    ll sum = 1;
    for (int i = 0; sum < k; i = (i + 1) % n)
    {
        sum = sum / a[i] * (a[i] + 1);
        a[i]++;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < a[i]; j++)
            cout << s[i];
    }
    return 0;
}

小红的构造题

题目链接 :小红的构造题

题目大意:

在这里插入图片描述

构造一个字符串,至少包含k个 red子序列,并且字符串长度不超过200000

思路:构造

这道题就不能用上道题的方法了,为什么?

假设k == 1e14,那么为了让字符串最短,那么每个字目的长度为1e5,那么三个字母的长度就为3e5超过范围。为什么上道题可以那样写,因为codeforces有10个字母,每个字母长度假设有100,那么最多只需要1000个字符就能解决问题。

那这道题这么解决:

我们可以先构造这样一个字符串rererererere....,在第一个re后面加x个d,那序列个数就加了x个,如果在第二个re后面加了x个d,那么就增加了3*x子序列,依次类推,在第k个re后面加x个d,那就增加k*(k+1)*x/2个子序列。

所以为了让字符串长度越小,所以需要从后往前枚举,每次填入x个字符串即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10, inf = 0x3f3f3f3f, mod = 998244353;
ll k;
ll a[N], c[N];
signed main()
{
#ifdef Xin
    freopen("in.in", "r", stdin);
    freopen("out.out", "w", stdout);
#endif

    cin >> k;
    if (k == 0)
    {
        cout << "a";
        return 0;
    }
    int M = 80000;
    for (int i = 1; i <= M; i++)
    {
        a[i] = (ll)i * (i + 1) / 2;
    }
    int id = 0;
    for (int i = M; i >= 1; i--)
    {
        if (k >= a[i])
        {
            c[i] = k / a[i];
            k %= a[i];
        }
    }
    for (int i = 1; i <= M; i++)
    {
        cout << "re";
        while (c[i]--)
            cout << 'd';
    }

    return 0;
}
相关文章
IO实战篇:奇偶数统计 | 带你学《Java语言高级特性》之七十七
在前几节中我们实战了很多案例,本节将带着读者开发一个较为简单的实际案例,实现对输入的数字的奇偶数字的出现次数的统计功能。
|
设计模式
设计模式之禅之六大设计原则-里氏替换原则
里氏替换原则说的就是面向对象语言的继承--->代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性。--->提高代码的重用性。--->子类可以形似父类,但又特殊于父类。--->提高代码的可扩展性。
1268 0
|
2天前
|
人工智能 JSON 安全
|
2天前
|
云安全 人工智能 安全
|
3天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
674 0
|
3天前
|
人工智能 自然语言处理 数据挖掘
最新版通义千问(Qwen3.8-Max-Preview)功能介绍
2026年,通义千问正式推出全新旗舰级大模型 **Qwen3.8-Max-Preview 预览版**,作为首款突破万亿参数规格的新一代基座模型,该模型总参数量达到**2.4万亿**,采用全新迭代的MoE混合专家架构,综合推理性能、长文本处理、多模态理解、复杂任务规划能力全面超越前代Qwen3.7-Max版本,整体实力跻身全球第一梯队,可对标海外顶级旗舰模型,是当前面向复杂工程开发、多智能体协同、超长文档解析、专业办公自动化场景的最优国产基座模型。
707 0
|
4天前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
646 25
|
3天前
|
人工智能 测试技术 语音技术
Qwen-Audio-3.0-TTS 正式发布!AI 语音从 “能说话” 升级到 “会带情绪表达”
阿里云发布Qwen-Audio-3.0-TTS语音合成大模型,支持细粒度标签控制(如[gasp][angry])、freestyle自由风格、16种语言及20种方言,声学鲁棒性强。含Flash(首包延时300ms)和Plus(全球榜单冠军)双版本,已在百炼平台开放调用。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
579 1

热门文章

最新文章