Educational Codeforces Round 119 (Div. 2), (C) BA-String硬着头皮做, 能做出来的
题目链接
题目
Example
input
3 2 4 3 a* 4 1 3 a**a 6 3 20 **a***
output
abb
abba
babbbbbbbbb
题意
n--字符串长度, k--每个星号最多代表k个b , x--第x小的字符串s的子串(可以是不连续子串)
每一个星号可以换成0~k个b, 需要求出第x小的字符串s的子串.
题解
a****a***a**(连续的星号指两个a或者边缘之间夹的星号, 可以为1)
从后面往前看(两个星号), 对于相邻的cnt个星号, 它们可以有cnt*k+1(下方以res代替)种出现方式, 即0~cnt*k个b。
再往前看(三个星号), 前面每多一种情况, 整体就多上面的res个, 也就是(cnt*k+1) * res。
但是, 每段连续的星号要放多少个b呢?
还是从后往前看, 每次遇到连续的星号, x/(cnt*k+1), 连续的星号的情况个数为x%(cnt*k+1)。
值得注意的是, 在一切的开始之时x--了!!! ----------> 因为排名是从1开始的, 不是0, 所以-1。
AC代码
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { int t; cin >> t; while(t --) { LL h[2010]={0}; int n, k; LL x; string s; cin >> n >> k >> x>> s; x --;//排名是从1开始的, 不是0, 所以-1. LL now=1; int cnt = 0; for(int i = n-1; i >= 0 && x != 0; i --) { if(s[i]=='*')cnt ++; else if(cnt>0) { h[i] = x % ((LL)cnt*k+1); x /= ((LL)cnt * k +1); cnt = 0; } } for(int i=0;i<x;i++)cout << "b";//最前面没有a,不能赋值给h[i] for(int i =0; i < n; i ++) { if(s[i] == 'a') { cout << 'a'; for(int j = 0; j < h[i] ; j ++)cout << 'b'; } } cout << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人