【构造】构造一个字符串满足k个子序列问题总结
题目 Codeforces Subsequences
题目链接 :Codeforces Subsequences
题目大意:
构造一个字符串,至少包含k个
codeforces
子序列,并且字符串最短。
思路:构造
假设我们要找的不是
codeforces
的子序列,而是abcde
。如果一个字符串中a
字母不在最前面,那么把它移到最前面其他不变的话,就多了一个abcde
序列。所以为了让序列更多,那么只需要将所有的a
都移动到最前面即可。b
跟着a
的后面,c
跟着b
的后面,其他也如此。每个字母的排序问题已经解决了,那么现在就是每个字母有多少个的问题了。答案是我们应该让每个字母的数量尽可能接近。
证明:子序列的数量就等于
SumA * SumB * SumC * SumD * SumE
,SumA
表示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 Xinfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout);
#endifll 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 Xinfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout);
#endifcin >> 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;
}
【构造】构造一个字符串满足k个子序列问题总结相关推荐
- linux shell 字符串替换字符,关于bash:在shell脚本中替换另一个字符串的一个子字符串...
我有"我爱苏西并结婚",我想把"苏西"改成"萨拉". #!/bin/bash firstString="I love Suzi a ...
- 【LeetCode】1400. 构造 K 个回文字符串 Construct K Palindrome Strings
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计奇数字符出现次数 日期 题目地址:https:// ...
- 每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等
Distinct Subsequences 原题链接Distinct Subsequences 判断字符串s中有多少个子序列和t相等,一个字符串的子序列是将字符串中若干字符删除后形成的字符串 因为子序 ...
- Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)
文章目录 一.问题说明 二.解决方法 一.问题说明 问题来源:粉丝的提问 从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合(对比用库和不用库的方法) 二.解决方法 iter ...
- 给定一个字符串,输出第一次出现k次的字母java,c++实现
题目: 给定一个字符串,输出第一次出现k次的字母. 示例: 输入:abbcdaabgb 3 输出:a 输入:aaabbb 3 ...
- 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)
在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...
- 题目 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列。 样例 括号必须依照 ()顺序表示, ()[]
题目 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 样例 括号必须依照 "()"顺序 ...
- 从K个数组中任取一个字符串进行按顺序拼接
完整题目 给定K个字符串数组,从这K个数组中任取一个字符串,按顺序拼接,列出所有可能的字符串组合 样例: input:[['a','b','cd'],['de'],['e','f']] output: ...
- 以太坊区块链黑客松: 构造下一个数字世界
今年,新冠状病毒突袭全球,似乎给全世界按下了"暂停"键,我们所依赖的生活网络以及习以为常的经验皆被中断或迟延.作为回应,这种突变敦促我们去重思当下诸多行业的社会经济构架,其中包括艺 ...
- 2020 中国开源年会暨阿帕奇中国路演-以太坊区块链黑客松:构造下一个数字世界...
点击上方"开源社"关注我们 | 编辑:黄欣宜 | 设计:王福政 | 责编:王玥敏 9月11日 -10月 25日 // 线上黑客松 今年,新冠状病毒突袭全球,似乎给全世界按下了&q ...
最新文章
- 聊聊JvmGcMetrics的managementExtensionsPresent
- 「SLAM」三维空间刚体运动名词笔记
- socket异步处理问题
- 作者:熊贇(1980-),女,博士,复旦大学计算机科学技术学院教授。
- JavaScript中执行环境和栈
- python编程(数据库操作)
- android多击事件_Android中的多击事件
- 链表节点的删除(链表data升序有重复)
- SQL数据库的查询操作大全(select)
- JavaScript学习手册一:JS简介
- Android WebView加载webrtc视频通话
- 7-4 华氏度转摄氏度 (5分) java
- [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖
- 【筹码分析】改版通达信PAVE筹码引力分析个股强势区和走势
- SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
- 【find128】项目
- 给excel设置格式
- 希尔排序选择排序时间复杂度分析
- 有没有人帮忙出一份答案,本人急用,python一级试卷。谢谢
- 天魔心法之——识人篇