UVA Live 5911:Binary Encoding

題目描述:

題目中給出了Truncated binary encoding的一些限制,比如對於0~m-1以內的所有編碼,總長度是最小的,n-1位的編碼不能是n位編碼的前綴,而且每一個編碼都是不同的。在m是二進制冪的時候,Truncated binary encoding與二進制碼相同。

大致思路:

Truncated binary encoding跟數字上限m是有關係的,m不同的時候,編碼可能不同。我們對於每一個上限n,定義k和u,2^k ≤ n < 2^(k+1) and let u = 2^(k+1) - n。根據編碼規則可以知道,前u個編碼長度應該是k,而剩下的n-u個編碼長度是k+1。因爲長度是k+1的編碼會包含所有長度k的編碼爲前綴。所以編碼就應該是從0開始的u個數字採用二進制編碼,剩下的採用x+u的編碼。

代碼:

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

int u,k;

string Binary (int x, int len) {
    string s = "";
    while (x != 0) {
        if (x % 2 == 0)  s = '0' + s;
        else  s = '1' + s;
        x >>= 1;
    }
    while (s.length() < len)  s = '0' + s;
    return s;
}

string TruncatedBinary (int x) {
    if (x < u) return Binary(x, k);
    else return Binary(x+u, k+1);
}

int main() {
    int m;
    while (cin>>m) {
        int tmp = m;
        k = 0;
        while (tmp > 1) {
            k++;
            tmp >>= 1;
        }
        u = (1 << k+1) - m;
        for (int i = 0; i < m; i++) {
            cout<<TruncatedBinary(i)<<endl;
        }
    }
}

發佈了90 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章