Educational Codeforces Round 119 (Div. 2), (C) BA-String硬着头皮做, 能做出来的

题目链接  

Problem - C - Codeforces

 

题目

 

 

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;
}
复制代码

 

posted @   la-la-wanf  阅读(185)  评论(4编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示