题解:CF1620C BA-String

· · 题解

:::info[duel 纪要] flc 要刷勇者 tag,所以纠集 cyq,kdl,zjh 等人打 duel 准备 1v3 一题场。

遇到路人两个,zjh 摆烂不来,于是现在有五个人,但是路人之一去上厕所于是为了速度开房踢出一人。

开赛。哎简单场没优势拼手速。

我草这个键盘怎么自动键入 bie 啊!代码随机 CE 错位何以手速??

大战一会后 bie 没了。

我草这个键盘怎么自动键入 l 啊!

大战一会后 l 没了。

我草这个键盘怎么自动键入 v 啊!

kdl 坐在我旁边笑飞了,但过了一会后她的键盘开始随机键入 printf 了。

风水轮流转这回轮到我笑了哈哈……

何以战? :::

由于插入的是 \texttt b 而原有的是 \texttt a,然后是第 x 大字典序,所以高位比低位重要,把连续的星号看成一位,把 \texttt b 的数量看做数值,于是就变成了将 x 转化成一个混合进制的数字,直接写进制转换就好了。

复杂度线性。duel 被打爆了,怎么回事呢。

#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
    int n,k,t;
    cin>>n>>k>>t;
    t--;
    string s;
    cin>>s;
    if(t==0){
        for(char c:s)
        if(c=='a')cout<<'a';
        cout<<'\n';
        return;
    }
    vector<int>v;
    int flc=0;
    for(int i=0;i<s.size();i++)
    if(s[i]=='a'){
        if(flc)v.push_back(flc+1);
        flc=0;
    }else flc+=k;
    if(flc)v.push_back(flc+1);
    reverse(v.begin(),v.end());
    vector<int>ret;
    for(int i=0;i<v.size();i++){
        ret.push_back(t%v[i]);
        t/=v[i];
    }
    reverse(ret.begin(),ret.end());
    bool flg=1;
    int tp=0;
    for(int i=0;i<s.size();i++)
    if(s[i]=='a')cout<<'a',flg=1;
    else if(flg){
        flg=0;
        while(ret[tp]--)cout<<'b';
        tp++;
    }
    cout<<'\n';
}
signed main(){
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}
// 他将内心的嘀咕藏在自己擅长的笑容后头。