「上海へ銀川から東方航空MU5692便に乗っようこそ......」
「私たちの飛行機はすぐに離陸し、ヘッドフォンオフ、トレイテーブルを片付けてください......」
テーブルボードを片付け、ヘッドホンを脱いで、乗器QQは突然、何もしません。
袋の中にヘッドセットを置くための時間は、乗器QQは不注意紙のいくつかの小片を出しました。彼らは、過去の思い出です。
袋に注意がすでにどのくらいか分からない存在します。水の汚れ黄ばみ紙は、いくつかの単語は彼がそれらを認識することはできません。
具体的には、手紙には、Nを含有する文字の単語であります M判読できない文字があることを特徴とする請求、文字が使用#
代わりに。
各判読文字するメモリの残りとクベールQQは、文字K異なる候補が与えられます。
すべての可能な単語のリスト紙の上に自分の思い出、乗器QQに近い比較を容易にするために。
これらの単語を読んだ後、乗器QQはランキングの辞書順に、最初のXワードは元の単語であると信じています。
あなたは何かを書き込む前に乗器QQを知っていますか?
入力形式
整数N、M、KとX(1≤N≤500000,1≤M≤N、1≤K≤26,1≤X≤1018)の最初の行。
第2のワード線の長さはN、小文字です#
。
次のM列、文字Kを含む各行は、判読がこれらの文字で置き換えられてもよく、I番目の文字を表します。
言葉のせいぜいX番号を構築することはできないことを確実にするために。
出力フォーマット
答えを表す文字列に並びます。
サンプル
入力
5 2 3 4
c##nb
std
lws
出力
cslnb
元の問題をに変換することができる\(K-1 \)基数変換の問題
辞書組成の選択に応じて、#文字が不明であり、各行の候補文字以下を与える:イタリアこと\(X \)の組み合わせであります答えます。
辞書式順序、最初の注文の合計\(K ^ M \)可能、各列の候補の数が非常にバイナリ変換の問題こと、等しいからです。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 500000 + 5;
ll a[maxn];
char s[maxn];
char stemp[maxn];
char res[maxn];
ll len;
int main()
{
ll n,m,k,x;
scanf("%lld%lld%lld%lld",&n,&m,&k,&x);
x--;
scanf("%s",s);
int cnt=0;
while(x)
{
a[cnt++]=x%k; x/=k;
}
cnt=0;
for (int i = 0; i < m; i++)
{
scanf("%s", stemp);
sort(stemp, stemp + k);
res[cnt++]=stemp[a[m-i-1]];
}
cnt=0;
for (int i = 0; i < n; i++)
{
if (s[i] == '#')
{
printf("%c",res[cnt++]);
}
else printf("%c",s[i]);
}
return 0;
}