163002025-04-21 13:56:10GervidKígyózó szavakcpp17Accepted 100/1007ms1600 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <array>

using namespace std;
using ll = long long;

ll inf = 2e9;
vector<vector<ll>> dp, pref;
string ans;

void find(int remaining, int depth = 0, int letter = -1)
{
	if (remaining == 0) return;
	if (depth == 0)
	{
		ans = "";
		for (letter = 0; letter < 26; letter++)
		{
			if (pref[letter].back() >= remaining) break;
			remaining -= pref[letter].back();
		}
		ans += 'a' + letter;
		return find(remaining-1, depth + 1, letter);
	}
	if (0 < letter && pref[letter-1][pref[0].size() - 1 - depth] >= remaining)
	{
		ans += 'a' + letter - 1;
		return find(remaining-1, depth + 1, letter - 1);
	}
	else
	{
		ans += 'a' + letter + 1;
		return find(remaining-1 - (0 < letter ? pref[letter-1][pref[0].size()-1-depth] : 0), depth + 1, letter + 1);
	}
}

signed main()
{
	iostream::sync_with_stdio(0);
	cin.tie(0);

	int h, n, k, i, j;
	cin >> h >> n;

	dp.resize(26, vector<ll>(h+1));
	pref.resize(26, vector<ll>(h+1));
	for (i = 0; i < 26; i++) dp[i][1] = 1, pref[i][1] = 1;
	
	for (j = 2; j < h+1; j++)
	{
		for (i = 0; i < 26; i++)
		{
			dp[i][j] = min(inf, (i > 0 ? dp[i-1][j - 1] : 0) + (i < 25 ? dp[i+1][j - 1] : 0));
			pref[i][j] = pref[i][j - 1] + dp[i][j];
		}
	}
	
	while (n--)
	{
		int idx;
		cin >> idx;
		find(idx);
		cout << ans << '\n';
	}
}
SubtaskSumTestVerdictTimeMemory
base100/100
1Accepted0/01ms316 KiB
2Accepted0/01ms316 KiB
3Accepted5/51ms316 KiB
4Accepted5/51ms316 KiB
5Accepted5/51ms316 KiB
6Accepted5/51ms316 KiB
7Accepted5/51ms316 KiB
8Accepted5/51ms316 KiB
9Accepted5/54ms820 KiB
10Accepted5/54ms564 KiB
11Accepted5/54ms820 KiB
12Accepted5/54ms1076 KiB
13Accepted5/57ms1456 KiB
14Accepted6/63ms508 KiB
15Accepted6/64ms1012 KiB
16Accepted6/63ms564 KiB
17Accepted6/63ms756 KiB
18Accepted7/73ms732 KiB
19Accepted7/76ms1600 KiB
20Accepted7/73ms820 KiB