EOJ毎月2019.11 A(バイナリ変換)

「上海へ銀川から東方航空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;
}

おすすめ

転載: www.cnblogs.com/chilkings/p/11963890.html