将每个位置的y的数量写下来可以看作是x进制数, 最小的数也就是第一小的数是0,第二小的数是1,所以要把n-1 要注意*数量不同时每位的进制不同,比如m=1时x**x*这个数就是 3|2 进制 最小的是xx也就是00 第二小的是xxy => 01 第三小的是xyx => 10 第四小的是xyxy => 11 第五小的是xyyx => 20 第六小的是xyyxy => 21 注意到"个位"是逢2进1,"十位"是逢三进一,这种情况也是按照进制转化的方式模拟即可
#include <bits/stdc++.h>
using namespace std;
int L, m, n;
string s;
int main()
{
int T;
cin >> T;
while(T--) {
cin >> L >> m >> n >> s;
n--;
string ans;
//进制转换是从最低位开始计算的,所以要倒着遍历字符串
for(int i = s.size()-1 ; i >= 0 ; i --) {
int t = 1;
while( i >= 0 && s[i] == '*') { //计算当前位是多少进制
t += m;
i--;
}
int p = n%t; //进制转换
n /= t;
while(p--) ans += 'y'; //对应的加上多少个y
if(s[i] == 'x') ans += 'x';
}
reverse(ans.begin(), ans.end()); //因为是倒着的过程,所以要将答案再翻转回来
cout << ans << endl;
}
}
T = int(input())
for _ in range(T):
L, m, n = map(int, input().split())
s = input()
n -= 1
ans = ''
i = n-1
while i >= 0: #进制转换是从最低位开始计算的,所以要倒着遍历字符串
t = 1
while i >= 0 and s[i] == '*': #计算当前位是多少进制
t += m
i -= 1
ans += 'y'*(n%t) #对应的加上多少个y
n /= t
if i >= 0 and s[i] == 'x':
ans += 'x'
print(ans[::-1]) #因为是倒着的过程,所以要将答案再翻转回来
小红是一名计算机科学家,他正在研究一种特殊的字符串。这个字符串由小写字母 ‘x’ 和特殊字符 ‘*’ 构成。现在,他想要将这个字符串中的每个字符 ‘*’ 替换成 0 到 m 个小写字母 ‘y’ ,并将替换后的字符串称为 "xy字符串" 。对于原始字符串 s ,可以用不同替换方式可以得到多种不相同的 "xy字符串" ,小红现在想知道第 n 小的 "xy字符串" ,但是他现在忙于研究 "xy字符串” 的其他性质,你帮他解决这个问题吗?
假定有两个 "xy字符串" 分别为 s1 、 s2 ,这两个 "xy字符串" 满足以下特性:
第一行输入一个数字 T ( 1≤T≤2500 ) ,表示有 T 组测试用例。对于每一组用例:
第一行分别有 3 个数字, l ( 1≤1≤2500 ) , m ( 0≤m≤2500 ), n ( 1≤n≤1018 )。
第二行有一个字符串 s 由 l 个字符构成,字符串由小写字母 'x' 和特殊字符 ‘*’ 构成。
对于每组测试用例,输出一行字符串,表示第 n 小的 "xy字符串"
输入
2
4 1 3
x**x
2 4 3
x*
输出
xyyx
xyy
T 组测试用例的字符串 l 加起来不会超过 2500 。对于每组测试用例,可以保证 n 不会超过 不相同的 "xy字符串" 的数量