首页 > 其他分享 >字符串构建问题——cf_921_C. Did We Get Everything Covered?

字符串构建问题——cf_921_C. Did We Get Everything Covered?

时间:2024-02-02 21:55:06浏览次数:32  
标签:cout Get Did cf long 区间 sFind 字符串 define

目录

问题概述

原题参考:C.Did We Get Everything Covered?
给出n、k、m和一个字符串,要求判断字符串是否可以包含前k个字母的长度为n的全排列,如果可以,输出yes,如果不行,输出no并给出反例

Input:
3
2 2 4
abba
2 2 3
abb
3 3 10
aabbccabab
Output:
YES
NO
aa
NO
cc

看到这个输出,不得不想夸cf一句,不拘小节,yes、YES、Yes之类的全都算对,其余oj平台就emmm,看缘分了

思路想法

其实这个题是有一个简单版本的,要求给出满足n、k的最短字符串构造,由改题可知,最短字符串是n*k的,就是将前k个字符重复n遍,这个m显然是没有用的;由上面的一题可以得知,要想满足题意中的字符串要求,就需要有n个完整包含前k个字符的区间,也就是说,这样我们就可以从每个区间内选择字符去构造任意排列。但是该题的难点在于如何输出一个反例,我之后看了一些题解,也感觉有点模糊不清,琢磨了一阵子,大致可以这样理解
由第一题的提示我们可以大致将字符串分为n个区间,最极限的情况就是字符串的构建需要n个区间的字符,也就是无可替代的,但是对于反例我们是否直接输出n*i即可,显然是不行的,因为其他区间可以帮助他,也就是说,其他区间还有余力帮助不属于该区间的任务,对于字符串aabbccabab就可以将其分为aabbc\cab\ab,假如我们要ccc,其实可以在第二个区间加上c变成aabbc\ccab\ab,这样基本上是一样的(不知道大家能不能get到我的点),那什么时候每个区间不能帮助其他区间呢,就是取末尾字符的时候,这时候假如再加,那么可能造成区间的移动,从而变得不是自己,

参考代码

include <bits/stdc++.h>

using namespace std;

define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

define endl '\n'

define pll pair<long long, long long>

define pii pair<int, int>

define vi vector

define vl vector

define ll long long

define ull unsigned long long

const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
int n, k, m, ktmp, nCnt = 0;
bool sFind[27];
string s, ans = "";
void solve() {
memset(sFind, 0, sizeof sFind);
ktmp = 0, ans = "", nCnt = 0;
cin >> n >> k >> m >> s;
for(auto x:s) {
if(!sFind[x-'a'+1]) {
ktmp ++;
sFind[x-'a'+1] = 1;
}
if(ktmp == k) {
nCnt ++;
ktmp = 0;
ans += x;
memset(sFind, 0, sizeof sFind);
}
}
if(nCnt >= n) cout << "YES" << endl;
else {
cout << "NO" << endl;
for(int i=1; i<=k; i++) {
if(!sFind[i]) {
ans += string(1, i+'a'-1);
break;
}
}
int i = ans.size();
for(; i<n; i++) ans += "a";
cout << ans << endl;
}
}
int main() {

ifdef xrl

freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);

endif

FAST_IO;
int t = 1;
cin >> t;
while(t --) solve();

ifdef xrl

cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";

endif

return 0;

}

问题反思

这个题感觉我的理解还算是清楚的,所以写出来记录一手

标签:cout,Get,Did,cf,long,区间,sFind,字符串,define
From: https://www.cnblogs.com/notalking569/p/18004091

相关文章

  • 数学概率拆分——cf_921_D.Good Trip
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D.GoodTrip大致意思就是一个老师带着n个孩子,其中有m对是朋友,每对朋友之间有一个友谊值,不是朋友的则是0,这个老师要出去玩k次,每次可以带上两个小朋友(为什么不能一起带,这是偏爱!!!),如果这两个小朋友是朋友关系的话,那么他们的......
  • [BSidesCF 2020]Had a bad day
    [BSidesCF2020]Hadabadday打开网站有两个按钮,点击之后链接后都会加上?category=meowers猜测有文件包含漏洞,尝试?category=php://filter/read=convert.base64-encode/resource=index.php警告中看到.php出现了两次,推测源码中存在.php拼接,于是去掉.php得到PHP源码<?p......
  • CF620E New Year Tree
    CF620ENewYearTree题意:给出一棵n个节点的树,根节点为1。每个节点上有一种颜色ci​。m次操作。操作有两种:1uc:将以u为根的子树上的所有节点的颜色改为c。2u:询问以u为根的子树上的所有节点的颜色数量。1<=c<=60。由于c的范围,可以用一个整数来表示每棵子......
  • file_get_contents 避免出现按个 ssl -60 的报错 ,不进行数据验证 或者 使用php.ini 进
    1,使用不去验证数据$stream_opts=["ssl"=>["verify_peer"=>false,"verify_peer_name"=>false,]];$user_info=json_decode(file_get_contents($user_info_url,false,stream_context_create($stream_opts)));2,配置php.ini......
  • CF1687D Cute number 题解
    题目链接点击打开链接题目解法一个数\(c\)是可爱(下文称为合法)的,当且仅当\(c\in[x^2,x(x+1)]\)令\(a_i\)属于\([x_i,x_i(x_i+1)]\)一个显然的范围是\(x_1\le2\times10^6\)考虑枚举\(x_1\)现在说明一个结论:\(x_1\)固定时,\(x_i\)也固定了说明:不难发现,合法的不合......
  • CF620E New Year Tree 题解
    题目链接:CF或者洛谷这题很简单,看到颜色数,HH的项链?树,树上的HH的项链?带修,树上的镜中的昆虫?\(c_i\le60\),噢,easy了。考虑一类信息,表示有和无,对于某种颜色来讲,\(0/1\)表示无或者有,而或运算让我们从小区间的有无情况反映到大区间的有无情况。一种暴力的想法,为每种颜色建立一棵有......
  • CF921 D. Good Trip
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#definefirstfi#defineseconfse#defi......
  • CF922 div2 D. Blocking Elements
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#defineendl"\n"#definefif......
  • Python requests.get所有参数顺序、Python requests.post所有参数顺序
    request.get所有参数顺序:url(必选)、params、allow_redirects、auth、cert、cookies、headers、proxies、stream、timeout、verify -------------------------------------------------------------------------------------------------------------------------------------......
  • CF125D 题解
    思路首先可以发现前三个数中的两个数一定为一个等差数列中,所以我们对于前三个数枚举哪两个数是一个等差数列中的,设这两个数的差为\(w\),在原数列中找到一个最长的公差为\(w\)的等差数列,记为\(A\),剩下的数记为\(B\),此时有三种可能。\(|B|=0\),此时可以知道原数组就是等差数列......