題目描述:
題目中給出了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;
}
}
}