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